$scope.$on 触发了 3 次

$scope.$on fired 3 times

我有 2 个不同的 angular 控制器,其中一个像这样广播

$timeout(function() {
    if($scope.modal){
      $rootScope.$broadcast(DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST,id);
      $scope.modal.hide();
      $scope.modal.remove();
    }
}, 3000);

在另一个控制器中我正在捕捉广播。

$scope.$on(DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST,function(event,id){
    // some action
});

问题是 $scope.$on 函数被调用了 3 次。我已经提到

但无法使用它们获得解决方案。请帮帮我...!!

快速而肮脏的 hack:使用布尔标志

var once = true;
$timeout(function() {
   if($scope.modal){          
      $rootScope.$broadcast(DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST, {id: id, once: once});
      $scope.modal.hide();
      $scope.modal.remove();
      once = false;
   }
}, 3000);

在你的听众中:

$scope.$on(DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST,function(event,args){
   if(args.once)
      // some action, only the first time
});

请记住,只有当您找不到每次事件都调用 3 次广播的原因时,这才是(肮脏但仍然)的解决方案。

为了暂时解决问题,我做了如下操作,

if(!$rootScope.$$listenerCount[DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST]){
    $scope.$on(DATAINPUT_EVENT.REFRESH_COMPLETED_DATA_LIST,function(event,id){
         // some action
    });
}

但很快我发现我已经多次初始化我的控制器并且我已经采取纠正措施来删除控制器的多个声明。