Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs$广播一次,$开启两次_Javascript_Angularjs_Angularjs Scope_Event Listener_Angular Broadcast - Fatal编程技术网

Javascript Angularjs$广播一次,$开启两次

Javascript Angularjs$广播一次,$开启两次,javascript,angularjs,angularjs-scope,event-listener,angular-broadcast,Javascript,Angularjs,Angularjs Scope,Event Listener,Angular Broadcast,它从rootScope发送$broadcast一次,但侦听器($on)被调用两次 侦听器位于控制器中,它使用$rootScope.$on而不是$scope.$on。有人有这个问题吗 编辑 根示波器: $rootScope.$broadcast('menuActivateAction' + item.event_name_postfix, item.event_args); 其他控制员: $rootScope.$on('menuActivateActionPublish', function(e

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

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

编辑

根示波器:

$rootScope.$broadcast('menuActivateAction' + item.event_name_postfix, item.event_args);
其他控制员:

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

由于您在$rootScope上注册了侦听器上的$on,因此它不会随控制器一起销毁,下次初始化控制器时,它会再次被创建

您应该在控制器作用域上创建侦听器

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

请注意,避免使用控制器的两个实例意味着两个事件侦听器,这意味着该方法将执行两次!!(示例:使用两次“ng控制器”)

来补充que1326答案,例如,如果您使用的是ui路由器,并且具有类似

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

在yourPage.html中,您有一个
ng controller=“YourController as Ctrl”
,然后您将创建控制器的两个实例:一个实例由状态配置创建,另一个实例在html中创建。

我能做的唯一解决方案是在$viewContentLoaded事件中创建侦听器:

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

你应该提供你的代码也许你有两个控制器?也许你必须在控制器被破坏时删除侦听器。我甚至会在
.run
阶段注册监听器,而不是在控制器中注册监听器-为了避免auch问题,控制器应该只在自己的作用域上注册监听器。在我的例子中,在增量调用的listen上,可能会重复Hey。@UmairKhanzada抱歉,我不理解commentlisten
$rootScope.$broadcast('xyz')事件。侦听函数
$rootScope.$on('xyz',function(){console.log('running')})这取决于您在哪里有
$broadcast
$on
。在您的情况下,您应该在处理登录的函数中使用
$broadcast()
,无论您确定用户在哪里登录,并且
$on()
仅在单个位置。例如
app.run()
。这是如果您想使用
$rootScope
。如果您想在控制器或其他“模块”中使用它,那么可以使用
$scope.$on()
以及任意次数,因为它会被销毁