我可以在$ rootScope。$ on函数内调用$ rootScope。$ emit吗?

时间:2017-11-10 04:09:51

标签: javascript jquery angularjs

我想知道我是否可以在$rootScope.$emit函数内调用$rootScope.$on,原因是我有两个控制器ctrl1.js和`ctrl2.js, 我想在我的ctrl1.js

中调用ctrl2.js的方法

我一分钟前对angularjs很新,这是我的代码,谢谢你,

/* Ctrl1 */
$rootScope.$on("rootScopeDisplayPage", function(event,target){
      $rootScope.$emit("CallAMethodFromCtrl2", target);
});

/* Ctrl2 */
$rootScope.$on("CallAMethodFromCtrl2", function(event, target){
               $scope.displayArticle(target);
});

$scope.displayArticle = function(articleStatus){
   /* do something */
}

它就像一个嵌套的$rootScope.$on

谢谢,

2 个答案:

答案 0 :(得分:2)

$emit用于将数据从子节点传递到父节点。 $rootScope是所有元素的父范围,因此使用$emit没有意义。即使您使用它,也没有父元素可以捕获它。

相反,您可以使用$rootScope.$broadcast事件在控制器之间共享内容。

有关详细信息,请参阅$broadcast$emit

angular
  .module("app", [])
  .controller("Controller1", function($scope, $rootScope, $timeout){
    var add = function(a, b) {
      return a + b;
    }
    
    $timeout(function(){
      $rootScope.$broadcast("Add function", add);
    }, 2000);
    
    $scope.$on("Sub function", function(event, sub) {
      $scope.sub = sub(1, 2);
    });
  })
  .controller("Controller2", function($scope, $rootScope, $timeout){
    var sub = function(a, b) {
      return a - b;
    }
    
    $scope.$on("Add function", function(event, add) {
      $scope.sum = add(3, 4);
      $timeout(function(){
        $rootScope.$broadcast("Sub function", sub);
      }, 1000);
    });
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="Controller1">
    <span ng-show="!sub">Waiting for Sub function...</span>
    <span ng-show="sub">1 - 2 = {{ sub }}</span><br />
  </div>
  <div ng-controller="Controller2">
    <span ng-show="sum">3 + 4 = {{ sum }}</span>
    <span ng-show="!sum">Waiting for add function...</span><br />
  </div>
</div>

答案 1 :(得分:2)

有两种事件广播方法:$ rootScope。$ broadcast()和$ rootScope。$ emit()。第一个将通过范围树的后代发送事件。 $ emit()方法将通过作用域树的祖先向上发送事件。当您使用$ rootScope。$ on()方法绑定到事件时,无论原始事件如何被触发(即广播与发射),都将调用您的处理程序。

enter image description here

所以你不能使用$ rootScope。$ emit,因为发出的事件永远不会通过范围树。