Ant*_*una 18 javascript angularjs angularjs-directive
我最近在Angular中的指令中有一些问题没有被正确清理,因此会产生内存泄漏.
所以,今天,当我正在进行测试以确保不会发生时,我意识到没有办法停止观察.
var stopObserving = attrs.$observe('myProperty', function(newValue) {
updateElement(newValue);
});
Run Code Online (Sandbox Code Playgroud)
因为我认为它的工作方式与它的工作方式相同,$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);
});
});
Run Code Online (Sandbox Code Playgroud)
它失败了,因为有一个观察者.我已经检查过并且$destroy正在调用,因此,清洁完成了.但是,我怎么能摆脱那个观察者呢?
代码,如果你好奇的话在这里:
Bey*_*ers 19
在Angular 1.3及更高版本中,$ observe返回deregister函数,因此取消注册$ observe的工作方式与$ watch完全相同:
var stopObserving = attrs.$observe(...);
stopObserving();
Run Code Online (Sandbox Code Playgroud)
在AngularJs 1.2中,无法取消注册观察者,正如您正确指出的那样,$ observe返回回调函数.
然而,目前有一个PR可以更改$ observe以返回类似于$ watch和$ on的注销功能,不幸的是,由于突破性的变化,这只是针对1.3版本进行了分类.PR已经结束了:https://github.com/angular/angular.js/pull/5609
好消息是,根据PR,需要完整的3行代码来实现更改,所以如果您不能等到1.3版本,您可以自己轻松实现.
| 归档时间: |
|
| 查看次数: |
3518 次 |
| 最近记录: |