最近,我在 Angular 指令中的 jQuery 插件中遇到了一些问题,这些问题没有得到正确清理,因此导致了内存泄漏。
所以,今天,当我进行测试以确保这种情况不会发生时,我意识到没有办法停止观察。
var stopObserving = attrs.$observe('myProperty', function(newValue) {
updateElement(newValue);
});
因为我认为它的工作方式与 $watch
上的工作方式相同,但显然事实并非如此。根据文档, $observe
将返回回调函数,就是第二个参数。
我有这个测试:
describe('destroy',function(){
beforeEach(function(){
$scope.$destroy();
});
it('should have emptied the DOM node', function(){
expect(element.text()).toBe('');
});
it('shouldn\'t have any more watchers', function(){
dump(element.data().$scope.$$watchers);
expect(element.data().$scope.$$watchers.length).toBe(0);
});
});
它失败了,因为只有一个观察者。我已经检查过,$destroy
正在被调用,因此清理工作已完成。但是,我怎样才能摆脱那个观察者呢?
如果您好奇的话,代码在这里:
最佳答案
AngularJS 1.3 及更高版本
在 Angular 1.3 及更高版本中,$observe returns the deregister function ,因此注销 $observe 的工作方式与 $watch 完全相同:
var stopObserving = attrs.$observe(...);
stopObserving();
AngularJS 1.2 及更低版本
在 AngularJs 1.2 中,无法取消注册观察者,并且正如您正确指出的那样,$observe 返回回调函数。
然而,目前有一个 PR 开放更改 $observe,以返回类似于 $watch 和 $on 的取消注册功能,不幸的是,由于重大更改,这仅针对 1.3 版本进行分类。 PR已结束here : https://github.com/angular/angular.js/pull/5609
好消息是,根据 PR 需要整整 3 行新代码来实现更改。 ,因此,如果您等不及 1.3 版本,您可以自己轻松实现。
关于javascript - 如何在 AngularJS 中停止 $observe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926503/