我有一个问题,广播事件到另一个控制器。所以这里是交易。在网站的页脚中,我加载了另一个控制器(CMSController)。此外,我还有一个路径'/ help',该控制器也在加载并从CMS获取帮助中心数据。页脚中有与此相关的链接。让我们说条款和条件链接。要获取该数据,我需要转到'/ help'路由并调用getHelpPage()函数。这是我正在进行的正在进行的项目结构。所以从页脚我重定向到'/ help'路由并广播一个事件,我正在监听CMSController并调用getHelpPage()
$scope.openHelpCenterPage = function openHelpCenterPage(slug) {
if($location.path().indexOf('/help') === -1){
$location.path('/help');
}
$rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
};
并在CMSController中
$rootScope.$on('openHelpCenterPage', function (event, obj) {
$scope.getHelpPage(obj.slug);
});
问题是这不起作用。我想cMSController没有加载这是怎么回事。控制台中没有错误。
但是....在播放到$ timeout期间解决了问题,即使是0秒..
$timeout(function () {
$rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
},0);
但我不觉得这是一个很好的解决方案。还有其他想法???听完openHelpCenterPage后我也试过听$ routeChangeSuccess,但是再次没有结果....
$rootScope.$on('openHelpCenterPage', function (event, obj) {
$rootScope.$on('$routeChangeSuccess',function(){
$scope.getHelpPage(obj.slug);
})
});
也许是检测控制器是否满载的其他方法????非常感谢你的时间。希望我能很好地解释这个问题。
从我的理解你有2个控制器,当你尝试从一个控制器广播一个事件到第二个控制器它没有正在监听,因为它没有完全加载..为了避免这种情况你可以在加载后从第二个控制器触发事件然后继续正常流量看看这个样本。 CTRL2
这将在加载时触发事件
(function() {
'use strict';
appName.controller('CMSController', Controller);
Controller.$inject = ['$scope', '$rootScope', '$timeout', 'CONSTANTS', '$location', 'PAGE_DATA'];
function Controller($scope, $rootScope, $timeout) {
function inIt() {
$rootScope.$broadcast('pageLoaded');
}
inIt();
}
}())
CTRL1
这将听取另一个控制器加载的天气,然后像这样触发其广播
(function() {
'use strict';
appName.controller('secCtrl', Controller);
Controller.$inject = ['$scope', '$rootScope', '$timeout', 'CONSTANTS', '$location', 'PAGE_DATA'];
function Controller($scope, $rootScope, $timeout) {
var pageload = 0;
$rootScope.$on('pageLoaded', function(event, obj) {
$rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
});
}
}())
我所解释的是一个简单的方法,你可以尝试我的理解..根据你的要求改变
你可以让你的CMSController给rootScope的一个属性一个nugdge,设置一个标志。并且你可以告诉rootScope在你发射第一个事件后每隔100ms检查1-2秒,然后只在有标志的情况下广播另一个。
但我真的建议你得到调解员服务。只需进行常规服务,但使用它进行通信,然后将getter和setter设置为某个私有对象。一个控制器设置对象,其他控制器在准备就绪时读取它这样您就知道控制器已准备就绪,因为您正在请求控制器中的对象。
angular.module('app')
.factory('mediatorService', function() {
var _data= {};
return {
//setter
save: function (data){
_data= data;
},
//getter
get: function(){
return _data;
}
}
})
然后在一个控制器中你:
mediatorService.save(yourobject);
在另一个:
$scope.data = mediatorService.get();
对我来说,这是控制器之间数据通信的提供方式。你基本上有这个选择: