mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-23 11:37:38 +08:00
feat($compile): add support for $observer deregistration
In order to make the behavior compatible with $rootScope.$watch and $rootScope.$on methods, and
make it possible to deregister an attribute observer, Attributes.$observe method now returns a
deregistration function instead of the observer itself.
BREAKING CHANGE: calling attr.$observe no longer returns the observer function, but a
deregistration function instead.
To migrate the code follow the example below:
Before:
```
directive('directiveName', function() {
return {
link: function(scope, elm, attr) {
var observer = attr.$observe('someAttr', function(value) {
console.log(value);
});
}
};
});
```
After:
```
directive('directiveName', function() {
return {
link: function(scope, elm, attr) {
var observer = function(value) {
console.log(value);
};
attr.$observe('someAttr', observer);
}
};
});
```
Closes #5609
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user