diff options
| author | Matias Niemelàˆ | 2013-07-22 15:37:45 -0400 | 
|---|---|---|
| committer | Misko Hevery | 2013-07-26 23:49:54 -0700 | 
| commit | 15389b0e377e2a84b85178e993e4940d8098d0ed (patch) | |
| tree | 06054bded1c252ca0d2c62b1a47267fee4c1eb98 /src/ngAnimate | |
| parent | 7d69d52acff8578e0f7d6fe57a6c45561a05b182 (diff) | |
| download | angular.js-15389b0e377e2a84b85178e993e4940d8098d0ed.tar.bz2 | |
fix(ngAnimate): $timeout integration and cancel callbacks added
Diffstat (limited to 'src/ngAnimate')
| -rw-r--r-- | src/ngAnimate/animate.js | 140 | 
1 files changed, 71 insertions, 69 deletions
diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 201d4aab..28d36629 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -203,15 +203,15 @@ angular.module('ngAnimate', ['ng'])      var NG_ANIMATE_STATE = '$$ngAnimateState';      var rootAnimateState = {running:true}; -    $provide.decorator('$animate', ['$delegate', '$injector', '$window', '$sniffer', '$rootElement', -      function($delegate, $injector, $window, $sniffer, $rootElement) { +    $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', +      function($delegate, $injector, $sniffer, $rootElement) {        var noop = angular.noop;        var forEach = angular.forEach;        $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); -       function lookup(name) { +      function lookup(name) {          if (name) {            var classes = name.substr(1).split('.'),                classMap = {}; @@ -241,7 +241,7 @@ angular.module('ngAnimate', ['ng'])        /**         * @ngdoc object         * @name ngAnimate.$animate -       * @requires $window, $sniffer, $rootElement +       * @requires $timeout, $sniffer, $rootElement         * @function         *         * @description @@ -444,80 +444,72 @@ angular.module('ngAnimate', ['ng'])          and the onComplete callback will be fired once the animation is fully complete.        */        function performAnimation(event, className, element, parent, after, onComplete) { -        if(nothingToAnimate(className, element)) { -          (onComplete || noop)(); -        } else { -          var classes = ((element.attr('class') || '') + ' ' + className), -              animationLookup = (' ' + classes).replace(/\s+/g,'.'), -              animations = []; -          forEach(lookup(animationLookup), function(animation, index) { -            animations.push({ -              start : animation[event], -              done : false -            }); +        var classes = ((element.attr('class') || '') + ' ' + className), +            animationLookup = (' ' + classes).replace(/\s+/g,'.'), +            animations = []; +        forEach(lookup(animationLookup), function(animation, index) { +          animations.push({ +            start : animation[event]            }); +        }); -          if (!parent) { -            parent = after ? after.parent() : element.parent(); -          } -          var disabledAnimation = { running : true }; +        if (!parent) { +          parent = after ? after.parent() : element.parent(); +        } +        var disabledAnimation = { running : true }; -          //skip the animation if animations are disabled, a parent is already being animated -          //or the element is not currently attached to the document body. -          if ((parent.inheritedData(NG_ANIMATE_STATE) || disabledAnimation).running) { -            //avoid calling done() since there is no need to remove any -            //data or className values since this happens earlier than that -            (onComplete || noop)(); -            return; -          } +        //skip the animation if animations are disabled, a parent is already being animated +        //or the element is not currently attached to the document body. +        if ((parent.inheritedData(NG_ANIMATE_STATE) || disabledAnimation).running) { +          //avoid calling done() since there is no need to remove any +          //data or className values since this happens earlier than that +          (onComplete || noop)(); +          return; +        } -          var animationData = element.data(NG_ANIMATE_STATE) || {}; +        var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}; -          //if an animation is currently running on the element then lets take the steps -          //to cancel that animation and fire any required callbacks -          if(animationData.running) { -            cancelAnimations(animationData.animations); -            animationData.done(); -          } +        //if an animation is currently running on the element then lets take the steps +        //to cancel that animation and fire any required callbacks +        if(ngAnimateState.running) { +          cancelAnimations(ngAnimateState.animations); +          ngAnimateState.done(); +        } -          element.data(NG_ANIMATE_STATE, { -            running:true, -            animations:animations, -            done:done -          }); +        element.data(NG_ANIMATE_STATE, { +          running:true, +          animations:animations, +          done:done +        }); -          if(event == 'addClass') { -            className = suffixClasses(className, '-add'); -          } else if(event == 'removeClass') { -            className = suffixClasses(className, '-remove'); -          } +        if(event == 'addClass') { +          className = suffixClasses(className, '-add'); +        } else if(event == 'removeClass') { +          className = suffixClasses(className, '-remove'); +        } -          element.addClass(className); +        element.addClass(className); -          forEach(animations, function(animation, index) { -            var fn = function() { -              progress(index); -            }; +        forEach(animations, function(animation, index) { +          var fn = function() { +            progress(index); +          }; -            if(animation.start) { -              if(event == 'addClass' || event == 'removeClass') { -                animation.cancel = animation.start(element, className, fn); -              } else { -                animation.cancel = animation.start(element, fn); -              } +          if(animation.start) { +            if(event == 'addClass' || event == 'removeClass') { +              animation.endFn = animation.start(element, className, fn);              } else { -              fn(); +              animation.endFn = animation.start(element, fn);              } -          }); -        } - -        function nothingToAnimate(className, element) { -          return !(className && className.length > 0 && element.length > 0); -        } +          } else { +            fn(); +          } +        });          function cancelAnimations(animations) { +          var isCancelledFlag = true;            forEach(animations, function(animation) { -            (animation.cancel || noop)(element); +            (animation.endFn || noop)(isCancelledFlag);            });          } @@ -534,6 +526,7 @@ angular.module('ngAnimate', ['ng'])          function progress(index) {            animations[index].done = true; +          (animations[index].endFn || noop)();            for(var i=0;i<animations.length;i++) {              if(!animations[i].done) return;            } @@ -552,7 +545,7 @@ angular.module('ngAnimate', ['ng'])      }]);    }]) -  .animation('', ['$window','$sniffer', function($window, $sniffer) { +  .animation('', ['$window','$sniffer', '$timeout', function($window, $sniffer, $timeout) {      return {        enter : function(element, done) {          return animate(element, 'ng-enter', done); @@ -576,13 +569,13 @@ angular.module('ngAnimate', ['ng'])          done();        } else {          var activeClassName = ''; -        $window.setTimeout(startAnimation, 1); +        $timeout(startAnimation, 1, false);          //this acts as the cancellation function in case          //a new animation is triggered while another animation          //is still going on (otherwise the active className          //would still hang around until the timer is complete). -        return onComplete; +        return onEnd;        }        function parseMaxTime(str) { @@ -643,12 +636,21 @@ angular.module('ngAnimate', ['ng'])            }          }); -        $window.setTimeout(onComplete, duration * 1000); +        $timeout(done, duration * 1000, false);        } -      function onComplete() { +      //this will automatically be called by $animate so +      //there is no need to attach this internally to the +      //timeout done method +      function onEnd(cancelled) {          element.removeClass(activeClassName); -        done(); + +        //only when the animation is cancelled is the done() +        //function not called for this animation therefore +        //this must be also called +        if(cancelled) { +          done(); +        }        };      };    }]);  | 
