diff options
| -rw-r--r-- | src/ng/compile.js | 7 | ||||
| -rwxr-xr-x | test/ng/compileSpec.js | 17 | 
2 files changed, 19 insertions, 5 deletions
| diff --git a/src/ng/compile.js b/src/ng/compile.js index c7cd08bc..8cc518d5 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -775,7 +775,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {         * @param {function(interpolatedValue)} fn Function that will be called whenever                  the interpolated value of the attribute changes.         *        See the {@link guide/directive#Attributes Directives} guide for more info. -       * @returns {function()} the `fn` parameter. +       * @returns {function()} Returns a deregistration function for this observer.         */        $observe: function(key, fn) {          var attrs = this, @@ -789,7 +789,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {              fn(attrs[key]);            }          }); -        return fn; + +        return function() { +          arrayRemove(listeners, fn); +        };        }      }; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 5110c4d6..96d3c18b 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1914,15 +1914,14 @@ describe('$compile', function() {    describe('interpolation', function() { -    var observeSpy, directiveAttrs; +    var observeSpy, directiveAttrs, deregisterObserver;      beforeEach(module(function() {        directive('observer', function() {          return function(scope, elm, attr) {            directiveAttrs = attr;            observeSpy = jasmine.createSpy('$observe attr'); - -          expect(attr.$observe('someAttr', observeSpy)).toBe(observeSpy); +          deregisterObserver = attr.$observe('someAttr', observeSpy);          };        });        directive('replaceSomeAttr', valueFn({ @@ -2020,6 +2019,18 @@ describe('$compile', function() {      })); +    it('should return a deregistration function while observing an attribute', inject(function($rootScope, $compile) { +      $compile('<div some-attr="{{value}}" observer></div>')($rootScope); + +      $rootScope.$apply('value = "first-value"'); +      expect(observeSpy).toHaveBeenCalledWith('first-value'); + +      deregisterObserver(); +      $rootScope.$apply('value = "new-value"'); +      expect(observeSpy).not.toHaveBeenCalledWith('new-value'); +    })); + +      it('should set interpolated attrs to initial interpolation value', inject(function($rootScope, $compile) {        $rootScope.whatever = 'test value';        $compile('<div some-attr="{{whatever}}" observer></div>')($rootScope); | 
