【问题标题】:Angular $rootScope.$broadcast() event caught twice in controllerAngular $rootScope.$broadcast() 事件在控制器中捕获两次
【发布时间】:2014-11-05 10:29:31
【问题描述】:

按钮点击时的广播事件:-

$scope.onButtonClick = function(){
    $rootScope.$broadcast('onButtonClick');
}

并在另一个控制器中捕获事件:-

$rootScope.$on('onButtonClick',function(event){
  alert("catched");
  console.log(event);
});

但即使只发射了一次,它也捕捉到了两次。这是为什么呢?

【问题讨论】:

  • 很可能有两个控制器实例处于活动状态。一个常见的原因是在同一视图上使用$routeProvider 控制器和ng-controller
  • 那么如何解决呢?你能帮帮我吗?
  • 您是否按照 Chandermani 的建议使用 ng-controller 实例化了您的控制器?如果是这样,请删除 ng-controller 属性。使用 ng-controller、uirouter 和 ngRouter 实例化控制器是一种或另一种选择。如果您将控制器实例化两次,您将拥有它的两个实例。
  • @Chandermani :谢谢 :) 它的工作。我只在 uirouting 中给控制器,它可以工作:)
  • 让我将其添加为答案,以便标记为已回答的问题我可以得到一些功劳:)

标签: angularjs rootscope


【解决方案1】:

事实证明,由于 html 中的 ng-controller 声明以及 ui-router 的状态设置的一部分,多个控制器被实例化。

解决方案是删除其中一个声明。

【讨论】:

  • 删除了 html 中的 ng-controller 声明,因为我已经将它添加为路由器中的状态设置。现在一切正常。谢谢!
【解决方案2】:

如果您在$rootScope 上广播事件,您可以在每个控制器$scope 上捕获该事件。 IMO 你不应该在$rootScope 上看到这个事件。

$scope.$on('onButtonClick',function(event){
  alert("catched");
  console.log(event);
});

我创建了一个 plunker 展示,这表明它完全按预期工作。 Plunker

您可能有同一个控制器的多个实例,您可以在其中捕获事件。请按照 Chandermani 的建议进行检查。

【讨论】:

  • @user59442:您的第一个陈述是有效的,适合发表评论。但你最后的说法是错误的。这不是答案。
  • 这对我有帮助
  • 意见与实际行为有什么关系,这些都是事实问题,您应该根据某种具体的事实知识提供答案,而不是基于个人意见。
【解决方案3】:

Angular $rootScope.$broadcast() 事件在控制器中被捕获两次

$scope.$on('saveCancelLeadInfo', function (event, args) {
    if ($scope.$$listenerCount["saveCancelLeadInfo"] > 1) {
        $scope.$$listenerCount["saveCancelLeadInfo"] = 0;
    }
    your code here
});

【讨论】:

  • 这对我有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多