使用$ scope。$ emit和$ scope。$ on

如何使用.$emit.$on方法将$scope对象从一个控制器发送到另一个控制器?

function firstCtrl($scope) {
    $scope.$emit('someEvent', [1,2,3]);
}

function secondCtrl($scope) {
    $scope.$on('someEvent', function(mass) { console.log(mass); });
}

它不以我认为应该的方式工作。 $emit如何$emit$on工作?


首先,亲子范围关系很重要。 你有两种可能性来发出一些事件:

  • $broadcast - 向下调度事件给所有子范围,
  • $emit - 通过范围层次结构向上分派事件。
  • 我不知道你的控制器(范围)关系,但有几种选择:

  • 如果范围firstCtrl是母公司secondCtrl范围,你的代码应该通过更换工作$emit$broadcastfirstCtrl

    function firstCtrl($scope)
    {
        $scope.$broadcast('someEvent', [1,2,3]);
    }
    
    function secondCtrl($scope)
    {
        $scope.$on('someEvent', function(event, mass) { console.log(mass); });
    }
    
  • 如果您的范围之间没有父子关系,您可以将$rootScope注入控制器并将该事件广播到所有子范围(即secondCtrl )。

    function firstCtrl($rootScope)
    {
        $rootScope.$broadcast('someEvent', [1,2,3]);
    }
    
  • 最后,当你需要从子控制器分派事件到范围向上时,你可以使用$scope.$emit 。 如果firstCtrl范围是firstCtrl范围的父secondCtrl

    function firstCtrl($scope)
    {
        $scope.$on('someEvent', function(event, data) { console.log(data); });
    }
    
    function secondCtrl($scope)
    {
        $scope.$emit('someEvent', [1,2,3]);
    }
    

  • 我还会建议第四个选项作为@zbynour提议的选项的更好选择。

    无论传输和接收控制器之间的关系如何,都可以使用$rootScope.$emit而不是$rootScope.$broadcast 。 这样,事件仍然在$rootScope.$$listeners的集合中,而使用$rootScope.$broadcast事件传播到所有子范围,其中大部分可能不会是该事件的监听器。 当然,在接收控制器的最后,您只需使用$rootScope.$on

    对于这个选项,你必须记得销毁控制器的rootScope监听器:

    var unbindEventHandler = $rootScope.$on('myEvent', myHandler);
    $scope.$on('$destroy', function () {
      unbindEventHandler();
    });
    

    如何使用。$ emit和。$方法将$ scope对象从一个控制器发送到另一个控制器?

    你可以在应用层次结构中发送你想要的任何对象,包括$ scope

    这里有一个关于如何广播发射工作的快速想法。

    注意下面的节点; 全部嵌套在节点3中。当您有这种情况时,您可以使用广播发出

    注意:本例中每个节点的数量是任意的; 它可能很容易成为头号大事; 二号; 甚至是1,348。 每个数字只是这个例子的一个标识符。 这个例子的要点是显示Angular控制器/指令的嵌套。

                     3
               ------------
               |          |
             -----     ------
             1   |     2    |
          ---   ---   ---  ---
          | |   | |   | |  | |
    

    看看这棵树。 你如何回答以下问题?

    注:还有其他的方法来回答这些问题,但在这里我们将讨论广播散发 。 此外,当阅读下面的文本假设每个数字都有自己的文件(指令,控制器)ex one.js,two.js,three.js。

    如何节点1发言,节点3?

    在文件one.js中

    scope.$emit('messageOne', someValue(s));
    

    在文件three.js中 - 需要进行通信的所有子节点的最高节点。

    scope.$on('messageOne', someValue(s));
    

    节点2如何与节点3对话?

    在文件two.js中

    scope.$emit('messageTwo', someValue(s));
    

    在文件three.js中 - 需要进行通信的所有子节点的最高节点。

    scope.$on('messageTwo', someValue(s));
    

    节点3如何对节点1和/或节点2说话?

    在文件three.js中 - 需要进行通信的所有子节点的最高节点。

    scope.$broadcast('messageThree', someValue(s));
    

    在文件one.js && two.js您想要捕获邮件或两者兼而有之的文件。

    scope.$on('messageThree', someValue(s));
    

    节点2如何对节点1说话?

    在文件two.js中

    scope.$emit('messageTwo', someValue(s));
    

    在文件three.js中 - 需要进行通信的所有子节点的最高节点。

    scope.$on('messageTwo', function( event, data ){
      scope.$broadcast( 'messageTwo', data );
    });
    

    在文件one.js中

    scope.$on('messageTwo', someValue(s));
    

    然而

    当所有这些嵌套的子节点尝试像这样进行通信时,您将很快看到许多$ on$ broadcast$ emit

    这是我喜欢做的事情。

    在最上面的PARENT NODE(在这种情况下是3 )...,它可能是你的父控制器...

    所以,在文件three.js中

    scope.$on('pushChangesToAllNodes', function( event, message ){
      scope.$broadcast( message.name, message.data );
    });
    

    现在在任何子节点中,只需$发出消息或使用$ on捕获它。

    注意:在不使用$ emit$ broadcast$ on的情况下,在一个嵌套路径中串扰通常很容易,这意味着大多数情况下用于尝试让节点1与节点2通信或反之亦然。

    节点2如何对节点1说话?

    在文件two.js中

    scope.$emit('pushChangesToAllNodes', sendNewChanges());
    
    function sendNewChanges(){ // for some event.
      return { name: 'talkToOne', data: [1,2,3] };
    }
    

    在文件three.js中 - 需要进行通信的所有子节点的最高节点。

    我们已经处理过这个记得吗?

    在文件one.js中

    scope.$on('talkToOne', function( event, arrayOfNumbers ){
      arrayOfNumbers.forEach(function(number){
        console.log(number);
      });
    });
    

    您仍然需要使用$ on来记录每个特定的值,但是现在您可以在任何节点中创建您喜欢的任何内容,而无需担心在捕获和广播时如何通过父节点间隙获取消息通用pushChangesToAllNodes

    希望这可以帮助...

    链接地址: http://www.djcxy.com/p/13621.html

    上一篇: Working with $scope.$emit and $scope.$on

    下一篇: Can i use a Factory to implement dependency injection