aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomer Chachamu2014-03-04 15:29:11 +0000
committerMatias Niemelä2014-03-14 13:48:29 -0400
commita41a2a1d2ce20f86ac2709592e4ada527160e580 (patch)
tree85a813b9e319e84abca4e491114b16d25371fc97
parenteadd8d08d3ae67f4f774d14aaa160fe8c69b0da5 (diff)
downloadangular.js-a41a2a1d2ce20f86ac2709592e4ada527160e580.tar.bz2
fix(ngAnimate): setting classNameFilter disables animation inside ng-if
Closes #6539
-rw-r--r--src/ngAnimate/animate.js4
-rw-r--r--test/ngAnimate/animateSpec.js43
2 files changed, 45 insertions, 2 deletions
diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js
index 447dfa3a..542b678f 100644
--- a/src/ngAnimate/animate.js
+++ b/src/ngAnimate/animate.js
@@ -770,7 +770,7 @@ angular.module('ngAnimate', ['ng'])
fireDOMOperation();
fireBeforeCallbackAsync();
fireAfterCallbackAsync();
- fireDoneCallbackAsync();
+ closeAnimation();
return;
}
@@ -949,7 +949,7 @@ angular.module('ngAnimate', ['ng'])
animation, but class-based animations don't. An example of this
failing would be when a parent HTML tag has a ng-class attribute
causing ALL directives below to skip animations during the digest */
- if(runner.isClassBased) {
+ if(runner && runner.isClassBased) {
cleanup(element, className);
} else {
$$asyncCallback(function() {
diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js
index fb9ba19e..204ca9c3 100644
--- a/test/ngAnimate/animateSpec.js
+++ b/test/ngAnimate/animateSpec.js
@@ -3356,6 +3356,49 @@ describe("ngAnimate", function() {
});
});
+ it('should animate only the specified CSS className inside ng-if', function() {
+ var captures = {};
+ module(function($animateProvider) {
+ $animateProvider.classNameFilter(/prefixed-animation/);
+ $animateProvider.register('.capture', function() {
+ return {
+ enter : buildFn('enter'),
+ leave : buildFn('leave')
+ };
+
+ function buildFn(key) {
+ return function(element, className, done) {
+ captures[key] = true;
+ (done || className)();
+ }
+ }
+ });
+ });
+ inject(function($rootScope, $compile, $rootElement, $document, $sniffer, $animate) {
+ if(!$sniffer.transitions) return;
+
+ var upperElement = $compile('<div><div ng-if=1><span class="capture prefixed-animation"></span></div></div>')($rootScope);
+ $rootElement.append(upperElement);
+ jqLite($document[0].body).append($rootElement);
+
+ $rootScope.$digest();
+ $animate.triggerCallbacks();
+
+ var element = upperElement.find('span');
+
+ var leaveDone = false;
+ $animate.leave(element, function() {
+ leaveDone = true;
+ });
+
+ $rootScope.$digest();
+ $animate.triggerCallbacks();
+
+ expect(captures['leave']).toBe(true);
+ expect(leaveDone).toBe(true);
+ });
+ });
+
it('should respect the most relevant CSS transition property if defined in multiple classes',
inject(function($sniffer, $compile, $rootScope, $rootElement, $animate, $timeout) {