代码之家  ›  专栏  ›  技术社区  ›  Mr. Noddy

$范围$点火3次[关闭]

  •  1
  • Mr. Noddy  · 技术社区  · 8 年前

    我有两个不同的角度控制器,其中一个有这样的广播

    $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

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   illeb    8 年前

    快速和肮脏的黑客:使用布尔标志

    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次。

        2
  •  0
  •   Mr. Noddy    8 年前

    为了暂时解决这个问题,我做了如下的事情,

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

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