gpt4 book ai didi

javascript - 如何在 AngularJS 中停止 $observe

转载 作者:行者123 更新时间:2023-12-03 06:59:56 25 4
gpt4 key购买 nike

最近,我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com