mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-24 03:55:49 +08:00
fix(ngAnimate): TypeError Cannot call method 'querySelectorAll' in cancelChildAnimations
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
This commit is contained in:
committed by
Matias Niemelä
parent
e9881991ca
commit
c914cd99b3
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user