Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix(ngAnimate): TypeError Cannot call method 'querySelectorAll' in ca…
Browse files Browse the repository at this point in the history
…ncelChildAnimations

When an element containing both ng-repeat and ng-if directives attempts to remove any items from
the repeat collection, the following error is thrown: "TypeError Cannot call method 'querySelectorAll'
of undefined".  This happens because the cancelChildAnimations code naively belives that the jqLite
object always has an element node within it. The fix in this commit addresses to securely check to see
if a node was properly extracted before any child elements are inspected.

Closes #6205
  • Loading branch information
Stanislav Sysoev authored and matsko committed Feb 26, 2014
1 parent e988199 commit c914cd9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
25 changes: 15 additions & 10 deletions src/ngAnimate/animate.js
Original file line number Diff line number Diff line change
Expand Up @@ -942,16 +942,21 @@ angular.module('ngAnimate', ['ng'])

function cancelChildAnimations(element) {
var node = extractElementNode(element);
forEach(node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME), function(element) {
element = angular.element(element);
var data = element.data(NG_ANIMATE_STATE);
if(data && data.active) {
angular.forEach(data.active, function(operation) {
(operation.done || noop)(true);
cancelAnimations(operation.animations);
});
}
});
if (node) {
var nodes = angular.isFunction(node.getElementsByClassName) ?
node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :
node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);
forEach(nodes, function(element) {
element = angular.element(element);
var data = element.data(NG_ANIMATE_STATE);
if(data && data.active) {
angular.forEach(data.active, function(operation) {
(operation.done || noop)(true);
cancelAnimations(operation.animations);
});
}
});
}
}

function cancelAnimations(animations) {
Expand Down
16 changes: 16 additions & 0 deletions test/ngAnimate/animateSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3370,5 +3370,21 @@ describe("ngAnimate", function() {
expect(stat).toBe('gone');
});
});

it('should not throw an error when only comment nodes are rendered in the animation',
inject(function($rootScope, $compile) {

$rootScope.items = [1,2,3,4,5];

var element = html($compile('<div><div class="animated" ng-if="valid" ng-repeat="item in items"></div></div>')($rootScope));

$rootScope.$digest();

$rootScope.items = [];

$rootScope.$digest();

expect(element.children().length).toBe(0);
}));
});
});

0 comments on commit c914cd9

Please sign in to comment.