我将一个事件从我的导航栏控制器广播到另一个控制器,但是如果我多次初始化控制器(当我在应用程序中前后移动时)我在{{{ 1}}事件多次运行,因为它已多次注册。
$on
如何防止$rootScope.$on('submitBookingDialog', function(){
submitBookingDialog();
});
多次发生?
我找到了a solution,但我不知道它是否理想。
答案 0 :(得分:25)
首先,您需要在$rootScope
上发送活动吗?如果没有,那么您可以在$scope
上注册您的事件处理程序。每当您的控制器范围被销毁时,事件处理程序都将被销毁。然后,您可以通过$scope.$emit
或$scope.$broadcast
发送活动,具体取决于您的控制器层次结构。
话虽这么说,你需要做的就是销毁你的事件监听器是调用注册监听器时返回的注销函数:
var offSubmitBookingDialog = $rootScope.$on('submitBookingDialog', function(){
submitBookingDialog();
});
$scope.$on('$destroy', function() {
// Call the deregistration function when the scope is destroyed
offSubmitBookingDialog();
});
答案 1 :(得分:14)
这似乎是为我做的:
var removeListener = $rootScope.$on('submitBookingDialog', function(){
submitBookingDialog();
// Remove listener
removeListener();
});

答案 2 :(得分:6)
对于后人,我最终这样做了:
.run(function($rootScope) {
$rootScope.once = function(e, func) {
var unhook = this.$on(e, function() {
unhook();
func.apply(this, arguments);
});
};
})
因为我一直需要在一些地方这样做,所以这最终变得更加清洁了
在您的应用模块上,您现在只需拨打once
而不是$on
:
$rootScope.once('submitBookingDialog', function() {
submitBookingDialog();
});
答案 3 :(得分:3)
我遇到了类似的情况,所以我写了一个小库,让pub / sub更容易。
答案 4 :(得分:2)
也许你应该取消订阅控制器销毁事件
var removeSubmitBookingDialog = $rootScope.$on('submitBookingDialog',submitBookingDialog);
$scope.$on("$destroy", removeSubmitBookingDialog);