如何在AngularJS中停止$ observe

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正在调用,因此,清洁完成了.但是,我怎么能摆脱那个观察者呢?

代码,如果你好奇的话在这里:

https://github.com/firstandthird/angular-popbox

Bey*_*ers 19

AngularJS 1.3及以上版本

在Angular 1.3及更高版本中,$ observe返回deregister函数,因此取消注册$ observe的工作方式与$ watch完全相同:

var stopObserving = attrs.$observe(...);
stopObserving();
Run Code Online (Sandbox Code Playgroud)

AngularJS 1.2及以下版本

在AngularJs 1.2中,无法取消注册观察者,正如您正确指出的那样,$ observe返回回调函数.

然而,目前有一个PR可以更改$ observe以返回类似于$ watch和$ on的注销功能,不幸的是,由于突破性的变化,这只是针对1.3版本进行了分类.PR已经结束:https://github.com/angular/angular.js/pull/5609

好消息是,根据PR,需要完整的3行代码来实现更改,所以如果您不能等到1.3版本,您可以自己轻松实现.