javascript - 在注册听众之前调用 AngularJS ng-init $broadcast

标签 javascript angularjs

我正在尝试使用 $broadcast 向不确定数量的听众广播初始值

我正在用 ng-init 调用 $rootScope.$broadcast。广播在页面加载时正常工作,但未注册监听器。但是,后续调用会被正确接听。

html;

<div class="panel panel-body" ng-controller="Location" ng-init="setActiveLocation({{ defaultLocation }})">

方法;

    $scope.setActiveLocation = function(location) {
        console.log('broadcast:', location);
        $rootScope.$broadcast('setActiveLocation', location);
    };

一个听众;

       $scope.$on('setActiveLocation', function(event, location)
            {
                console.log('recieved: ', event)
                $scope.clearHistory();
                $scope.refreshHistory(location);
            });

我的问题是这样的; ng-init 应该在页面准备就绪时调用,那么为什么要在监听器准备好之前调用它呢?我应该怎么做才能防止这种情况发生?

最佳答案

“页面准备就绪时应调用 ng-init”。这个假设是错误的。查看 ngInitDirective(当前 Angular 为 1.4.7)。

var ngInitDirective = ngDirective({
  priority: 450,
  compile: function() {
    return {
      pre: function(scope, element, attrs) {
        scope.$eval(attrs.ngInit);
      }
    };
  }
});

pre-link阶段执行,与页面状态无关。

所以我猜你的设置是这样的:

<a ng-init="someFunctionInA()">
    <b ng-init="someFunctionInB()"></b>
</a>

如果附加到 a 的 Controller 执行 $broadcast 并且监听器在附加到 b 的 Controller 中注册,那么您的广播是甚至在监听器注册之前就已触发。

解决方案: 不要使用 ng-init。从您的指令中调用 init 函数。从指令 apost-link 函数调用您的广播函数。当 pre-link 从外部指令执行到内部指令时,post-link 反之亦然,因此您的内部 Controller (与监听器)将在外部 Controller 进行广播之前准备就绪。

关于javascript - 在注册听众之前调用 AngularJS ng-init $broadcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931355/

相关文章:

angularjs - Angular (半)动态表单生成

javascript - 将 Angular Kendo UI 网格导出到 Excel

javascript - ngIf 和 ngAnimate - 动画期间重复的 HTML 内容

javascript - 为什么这不起作用(删除与对象属性匹配的属性)

javascript - 通过更多项目获取元素

javascript - 如何在非点击事件触发时停止重定向到页面

javascript - 如果选中,AngularJS 数据绑定(bind)复选框到对象

javascript - AngularJS:我应该使用过滤器将整数值转换为百分比吗?

javascript - 文本区域字符计数器

javascript - 如何访问 Backbone Marionete 应用程序内的模型?