控制器加载bean后发送事件

时间:2016-01-28 18:41:30

标签: angularjs events

我有两个控制器,当用户按下按钮加载SeconvView时,FirctCtrl通过$ rootScope将事件发送到SecondCtrl。$ broadcast。

 // FirstCtrl.js
 app.controller('FirstCtrl', ['$scope', function($rootScope, $scope) {
   // ...
   $scope.emitEvent = function(){
      console.log("Emitting event");
      $rootScope.$broadcast("EventName", "event data");
   }
}]);

// SecondCtrl.js
app.controller('SecondCtrl', ['$scope', function($rootScope, $scope) {
  console.log("Hola from SecondCtrl");
  $rootScope.$on("EventName", function(event, data){
    console.log(data);
  });
}]);

日志输出:

Emitting event
Hola from SecondCtrl

所以,问题是SecndCtrl无法捕获事件。我认为这是因为事件在加载SecondCtrl之前发送。 没有超时,我可以解决这个问题,但是...常见的,我必须使用超时:/

     // FirstCtrl.js
     app.controller('FirstCtrl', ['$scope', function($rootScope, $scope) {
       // ...

        $scope.emitEvent = function(){
           $timeout(function() {
           console.log("Emitting event");
           $rootScope.$broadcast("EventName", "event data");
         },100);
        }

    }]);

日志输出:

Hola from SecondCtrl
Emitting event
event data

解决这个问题的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

在控制器之间传递数据是服务/工厂的主要用途之一

 // FirstCtrl.js
 app.controller('FirstCtrl', ['$scope', function(MyFactory, $scope) {
   // ...
   $scope.emitEvent = function(){
      console.log("Emitting event");
      MyFactory.storedvalue = "event data";
   }
}]);

// SecondCtrl.js
app.controller('SecondCtrl', ['$scope', function(MyFactory, $scope) {
  console.log("Hola from SecondCtrl");

    console.log(MyFactory.storedvalue);
  });
}]);