2014-09-11 84 views
24
按钮点击

Broadcating事件: -

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

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

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

但它抓住了两次甚至尽管它只发射一次。这是为什么?

+5

最大的可能是控制器的两个实例是激活的。一个常见的原因是在同一视图中使用'$ routeProvider'控制器和'ng-controller'。 – Chandermani 2014-09-11 13:16:11

+0

那么如何解决呢?你能帮我么? – Pratibha 2014-09-11 13:25:06

+0

Chandermani建议您是否使用ng控制器实例化了您的控制器?如果是这样,请删除ng-controller属性。使用ng-controller,uirouter和ngRouter来实例化控制器是另一种选择。如果你实例化控制器两次,你将有两个实例。 – Martin 2014-09-12 08:46:19

回答

39

事实证明,由于在html中声明了ng-controller,并且还作为ui-router的状态设置的一部分,所以多个控制器被实例化。

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

+1

在html中删除了ng-controller声明,因为我已经将它添加为路由器中的状态设置。事情现在正常。谢谢! – 2015-07-28 19:04:12

9

如果您在$rootScope上播出活动,您可以在每个控制器$scope上发现活动。 海事组织你不应该赶上$rootScope事件。

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

我创建了一个plunker展示柜,它展示了它的工作原理与预期完全相同。 Plunker

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

+0

它仍然捕获两次... – Pratibha 2014-09-11 13:24:10

+0

@ user59442:您的第一条语句是有效的并且很有意见。但是你最后的陈述是错误的。这不是一个答案。 – gkalpak 2014-09-11 13:57:27

+0

的意思,我没有得到它?哪些声明? – Pratibha 2014-09-12 08:56:10

4

$rootScope.$broadcast()事件控制器不上两次

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

这帮了我。 – MilesStanfield 2016-10-09 01:54:54