Angularjs $播放一次,$播放两次

时间:2015-06-21 20:19:48

标签: javascript angularjs angularjs-scope event-listener angular-broadcast

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

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

修改

rootScope:

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

其他控制器:

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

4 个答案:

答案 0 :(得分:23)

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

您应该在控制器范围

上创建监听器
$scope.$on('menuActivateActionPublish', function(event) {});

答案 1 :(得分:7)

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

答案 2 :(得分: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创建。

答案 3 :(得分:0)

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

$scope.$on('$viewContentLoaded', function() {
  //Put your listener(s) in here
  $scope.$on('menuActivateActionPublish', function(event) {});
});