javascript - 如何在 AngularJS 中停止 $observe

标签 javascript angularjs angularjs-directive

最近,我在 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 正在被调用,因此清理工作已完成。但是,我怎样才能摆脱那个观察者呢?

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

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

最佳答案

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/

相关文章:

javascript - 如何在 AngularJS 循环中调用第二个顺序 Promise 设计模式方法?

c# - 可以通过 $http 但不能通过 ngResource 调用 WCF 服务

javascript - 如何使用angular js在html元素中绑定(bind)javascript和ng-click事件?

javascript - 避免并行异步任务中的冗余

javascript - 如何检查 HTML 标签,然后在 jQuery 验证中添加错误

javascript - 将模态框放置在 Vue.js 的子组件中

javascript - 如何更改 angularJS 中的观察者顺序?

javascript - Node.js + TSV 格式化

javascript - Angularjs通过过滤器获取indexOf

angularjs - Angular 指令 - 在链接方法中定义的模板函数的属性中调用函数时出现插值问题