我有两个控制器,当用户按下按钮加载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
解决这个问题的更好方法是什么?
答案 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);
});
}]);