我的应用程序从选项卡中复杂,每个选项卡都是不同的范围。当我关闭一个选项卡时,我触发了"Close_Tab"事件,并且所有控制器都有
$rootScope.$on('Close_Tab', function (event, data)
这应该会抓住这个事件。
当我说所有控制器时,我的意思是所有打开的选项卡。 问题是,如果我关闭选项卡并编写:
element.remove() // remove the tab from the DOM.
$scope.destroy()
范围未删除!! 当我调试应用程序时,我看到关闭的选项卡仍然获取事件。
有人知道吗?
$rootScope.$on()
返回一个将取消注册侦听器的函数。
当指令的作用域被销毁时,应调用该函数。
// add listener and hold on to deregister function
var deregister = $rootScope.$on('eventName', function(event) {
// your best code
});
// clean up listener when directive's scope is destroyed
$scope.$on('$destroy', deregister);
解决这个问题是在$on事件中调用 deregister(( 函数。 因为$on事件返回事件的取消注册函数,我们需要做的就是调用该函数。
范围事件侦听器应注册$scope,而不是$rootScope。然后,当范围被销毁时,它们将自动删除:
̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶C̶l̶o̶s̶e̶_̶T̶a̶b̶'̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶e̶v̶e̶n̶t̶,̶ ̶d̶a̶t̶a̶)̶
$scope.$on('Close_Tab', function (event, data)
问题是$emit处于$rootscope级别,因此$scope根本没有获得事件。
不应该在$rootScope
上做$emit
,而应该使用$broadcast
。
事件可以广播到作用域子项或发出到作用域父项。