20

它从 rootScope 发送一次 $broadcast,但侦听器 ($on) 被调用两次。

侦听器位于控制器中,它使用$rootScope.$on而不是$scope.$on. 有人遇到过这个问题吗?

编辑

根范围:

$rootScope.$broadcast('menuActivateAction' + item.event_name_postfix, item.event_args);

其他控制器:

$rootScope.$on('menuActivateActionPublish', function(event) {});
4

4 回答 4

31

由于您在 $rootScope 上注册了 $on 侦听器,因此它不会被控制器破坏,并且下次您初始化控制器时它会再次创建。

您应该在控制器范围内创建您的侦听器

$scope.$on('menuActivateActionPublish', function(event) {});
于 2015-06-23T08:13:01.983 回答
10

小心避免控制器的两个实例意味着两个事件侦听器,这意味着该方法被执行两次!(例如:使用两次 'ng-controller' )

于 2017-09-28T08:30:21.970 回答
4

为了补充 que1326 的答案,例如,如果您使用的是 ui-router 并且有类似的东西

.state('app.yourpage', {
            url:'yourPage',
            views: {
                'content@': {
                    templateUrl : 'views/yourPage.html',
                    controller  : 'YourController'
                }
            }
        })

在 yourPage.html 中,您有一个ng-controller="YourController as Ctrl",然后您正在创建控制器的 2 个实例:1 个实例由状态配置创建,另一个实例在您的 html 中创建。

于 2017-10-31T13:50:36.777 回答
0

我可以开始工作的唯一解决方案是在 $viewContentLoaded 事件中创建侦听器:

$scope.$on('$viewContentLoaded', function() {
  //Put your listener(s) in here
  $scope.$on('menuActivateActionPublish', function(event) {});
});
于 2018-03-27T17:56:01.867 回答