为什么在调用 $scope.destroy() 后销毁范围不起作用



我的应用程序从选项卡中复杂,每个选项卡都是不同的范围。当我关闭一个选项卡时,我触发了"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

事件可以广播到作用域子项或发出到作用域父项。

最新更新