如何解决您是否需要在$ scope $ destroy事件中取消绑定$ scope$ on?
$scope.$on()
失去其外观时,
。注意,$rootScope.$on()
绑定不会发生这种情况。您还可以查看AngularJS的$
scope文档。
用几句话回答:
-
$scope.$on();
将被自动销毁。 - 您需要
$rootScope.$on()
手动销毁。
文档说明:
范围销毁-当不再需要子范围时,子范围创建者有责任通过scope。$ destroy()API销毁它们。这样做是为了阻止$ digest调用传播到子作用域,并允许垃圾回收器回收由子作用域模型使用的内存。
如何销毁示例$rootScope.$on()
:
//bind event
var registerScope = $rootScope.$on('someEvent', function(event) {
console.log("fired");
});
// clean up
$scope.$on('$destroy', registerScope);
此plnkr将为您显示$scope.$on()
和
的不同行为$rootScope.$on()
。
通过在此插入控件中切换视图,控制器将重新绑定到您的视图。该$rootScope.$on();
事件被绑定每次切换视图时不破坏前视图的事件绑定。这样,$rootScope.$on()
听众将被堆叠/倍增。$scope.$on()
绑定不会发生这种情况,因为它将通过切换视图而被破坏(丢失DOM中的E2E绑定表示)。
注意:
-
$scope.$on('event');
会听$scope.$broadcast('event')
&$rootScope.$broadcast('event')
-
$rootScope.$on('event');
只会听$rootScope.$broadcast('event')
解决方法
我有使用$ on绑定事件的指令,在销毁作用域时是否需要删除该绑定,或者它是自动完成的?还需要致电$ element.off吗?
return {
restrict: 'A',link: function($scope,$element,$attrs) {
$element.on('load',function() {
$element[0].contentWindow.focus();
});
$scope.$on('iframe:focus',function() {
$element[0].contentWindow.focus();
});
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。