Skip to content

Commit

Permalink
fix(ngIf): don't create multiple elements when changing from a truthy…
Browse files Browse the repository at this point in the history
… to another thruthy value.

Fixes angular#4852.
  • Loading branch information
tbosch authored and jamesdaily committed Jan 27, 2014
1 parent f04f84f commit 0884b62
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 11 deletions.
22 changes: 11 additions & 11 deletions src/ng/directive/ngIf.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
}
/*
The transition styles can also be placed on the CSS base class above
The transition styles can also be placed on the CSS base class above
*/
.animate-if.ng-enter, .animate-if.ng-leave {
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
Expand Down Expand Up @@ -92,16 +92,16 @@ var ngIfDirective = ['$animate', function($animate) {
$scope.$watch($attr.ngIf, function ngIfWatchAction(value) {

if (toBoolean(value)) {

childScope = $scope.$new();
transclude(childScope, function (clone) {
block = {
startNode: clone[0],
endNode: clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ')
};
$animate.enter(clone, $element.parent(), $element);
});

if (!childScope) {
childScope = $scope.$new();
transclude(childScope, function (clone) {
block = {
startNode: clone[0],
endNode: clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ')
};
$animate.enter(clone, $element.parent(), $element);
});
}
} else {

if (childScope) {
Expand Down
16 changes: 16 additions & 0 deletions test/ng/directive/ngIfSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,22 @@ describe('ngIf', function () {
expect(element.children().length).toBe(1);
});

it('should not add the element twice if the condition goes from true to true', function () {
$scope.hello = 'true1';
makeIf('hello');
expect(element.children().length).toBe(1);
$scope.$apply('hello = "true2"');
expect(element.children().length).toBe(1);
});

it('should not recreate the element if the condition goes from true to true', function () {
$scope.hello = 'true1';
makeIf('hello');
element.children().data('flag', true);
$scope.$apply('hello = "true2"');
expect(element.children().data('flag')).toBe(true);
});

it('should create then remove the element if condition changes', function () {
$scope.hello = true;
makeIf('hello');
Expand Down

0 comments on commit 0884b62

Please sign in to comment.