diff options
| author | Josh Kurz | 2013-12-12 01:39:40 -0500 | 
|---|---|---|
| committer | Pete Bacon Darwin | 2013-12-19 13:46:30 +0000 | 
| commit | 277a5ea05d50fb27243b98570c3ca9394b31e935 (patch) | |
| tree | e6b25127fef2b7d6f78b94d56c7c8a663467253f | |
| parent | 9865a7c0ad678fa6a3daa2719e37d94aeb62f67b (diff) | |
| download | angular.js-277a5ea05d50fb27243b98570c3ca9394b31e935.tar.bz2 | |
docs($interval): remind the developer to destroy their intervals
It is essential that users of `$interval` destroy the interval when they are finished.
Otherwise you can get memory leaks.
Often `$intervals` are used in directives or controllers and developers don't think
about what happens when the component is destroyed.
If a directive/controller scope is destroyed, then the $interval should be destroyed as well.
This could cause some issues with developers who assume that the interval will be cleared
for them when the scope is destroyed.
Closes #5377
I believe that the library could/should handle this as well, but thats another issue.
| -rw-r--r-- | src/ng/interval.js | 21 | 
1 files changed, 18 insertions, 3 deletions
| diff --git a/src/ng/interval.js b/src/ng/interval.js index 1ae13648..bde4e25e 100644 --- a/src/ng/interval.js +++ b/src/ng/interval.js @@ -24,6 +24,14 @@ function $IntervalProvider() {        * In tests you can use {@link ngMock.$interval#methods_flush `$interval.flush(millis)`} to        * move forward by `millis` milliseconds and trigger any functions scheduled to run in that        * time. +      *  +      * <div class="alert alert-warning"> +      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished +      * with them.  In particular they are not automatically destroyed when a controller's scope or a +      * directive's element are destroyed. +      * You should take this into consideration and make sure to always cancel the interval at the +      * appropriate moment.  See the example below for more details on how and when to do this. +      * </div>        *        * @param {function()} fn A function that should be called repeatedly.        * @param {number} delay Number of milliseconds between each function call. @@ -52,20 +60,27 @@ function $IntervalProvider() {                        $scope.blood_1 = $scope.blood_1 - 3;                        $scope.blood_2 = $scope.blood_2 - 4;                    } else { -                      $interval.cancel(stop); +                      $scope.stopFight();                    }                  }, 100);                };                $scope.stopFight = function() { -                $interval.cancel(stop); -                stop = undefined; +                if (angular.isDefined(stop)) { +                  $interval.cancel(stop); +                  stop = undefined; +                }                };                $scope.resetFight = function() {                  $scope.blood_1 = 100;                  $scope.blood_2 = 120;                } + +              $scope.$on('$destroy', function() { +                // Make sure that the interval is destroyed too +                $scope.stopFight(); +              });              }              angular.module('time', []) | 
