这里有一个问题,广播事件到另一个控制器。所以这里是交易。在网站的页脚中,我加载了另一个控制器(CMSController)。我也有路线' / help'该控制器还在哪里加载并从CMS获取帮助中心数据。 页脚中有与此相关的链接。让我们说条款和条件链接。要获取这些数据,我需要转到' / help'路由并调用getHelpPage()函数。这是我正在进行的正在进行的项目结构。 所以从页脚我重定向到' / help'路由和广播一个事件,我正在监听CMS控制器并将调用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没有加载这是怎么回事。控制台中没有错误。
然而......将boradcast推入$ 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);
})
});
可能有其他方法来检测控制器是否满载???? 非常感谢你的时间。希望我能很好地解释这个问题。
答案 0 :(得分:0)
你可以让你的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();
对我来说,这是控制器之间数据通信的提供方式。你基本上有这个选择:
rootScope作为中介 糟糕 - 污染了rootcope,如果不注意名字,可能会错过其他地方 良好 - 快速且几乎没有代码
<强>事件强> 好 - 可以向所有倾听的人播放,在父母和孩子参与时都很好 糟糕 - 像你这样的同步问题
路线参数 良好 - 当你有嵌套控制器时快速而简单 错误 - 仅限于使用
Cookie和本地存储空间 好 - 如果你需要坚持重装 错误 - 超出角度范围的解决方法 - 旧浏览器只有cookie。保护浏览器设置可能会在没有您能够做出反应的情况下删除
调解员服务 良好 - 简单但有效,明确分离角色 错误 - 需要更多锅炉代码
答案 1 :(得分:0)
从我的理解你有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'});
});
}
}())
我所解释的是一个简单的方法,你可以根据我的理解尝试..根据你的要求改变