【问题标题】:$rootScope.$emit not working$rootScope.$emit 不工作
【发布时间】:2014-11-05 20:49:20
【问题描述】:

我正在尝试使用 AngularJS 将事件发送到第二个控制器:

第一控制器:

    $scope.checkThemeContent = function(theme) {
    console.log("Trying to get cards for theme id: " +theme.id);
    console.log(theme);

    $scope.selectedTheme = theme;

    if(theme.count_of_cards >0) {
        //$scope.$emit('detailDisplayed', {});
        $scope.displayedTemplate = 'detail';
        $rootScope.$emit('detailDisplayed', {});
    } else {
        $scope.displayedTemplate = 'empty';
    }
};

第二控制器:

 $rootScope.$on('detailDisplayed', function(event, args) {
        alert('Received');
        $scope.initDataGrid();
    });

但是没有触发事件。

我尝试反向使用作用域,它可以工作。

请问哪里有问题?

我遵循了这个教程:

http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

感谢您的帮助。

【问题讨论】:

  • 事件是否在$on 处理程序附加之前发出?
  • 如果这是反向工作,也许你在定义监听器之前正在做一个发射编辑:与@someKittens 说的一样
  • 如果您创建了一个 JSFiddle 或 Plunkr 示例将非常有帮助。
  • Durp,你在 rootScope 你不能发射更高
  • $emit-ing 沿着 $rootScope 是绝对可以的,并且在大多数情况下被认为比通过指令/组件向上或向下传播更快

标签: javascript angularjs emit


【解决方案1】:

我尝试反向使用作用域,它可以工作。

在我看来,您的代码的结构是在 $on 处理程序附加到 $rootScope 之前发出事件的位置。确保在发出事件之前已实例化第二个控制器。

【讨论】:

  • 您好,您的确切意思是“在发出事件之前已实例化”。请问?
  • @redrom 您需要确保第二个控制器在发出事件之前正在侦听该事件。
  • 请问我该如何检查?
  • 在 JSFiddle 上创建一个示例供我们查看
【解决方案2】:

请记住:emit 沿着原型链上升,broadcast 下降。如果您已经在顶部(即$rootScope),它就不能再高了。使用$broadcast 让事件全面触发。

$rootScope.$broadcast('detailDisplayed');

查看这篇文章:

https://blog.safaribooksonline.com/2014/04/08/refactoring-angularjs-get-hands-filthy/

【讨论】:

  • 这里不相关,因为事件是在$rootScope上发送和接收的。
  • 这实际上帮助了我。 $emit 没有工作。改为$broadcast。我正在使用 $rootScope
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2020-03-26
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多