我正在尝试在页面加载时向另一个控制器广播一个事件。虽然接收广播的控制器尚未初始化,但因此没有对事件作出反应。
app.controller('ControllerOne', ['$scope', '$rootScope') {
if(someVar) {
$rootScope.$broadcast("my-event");
}
}]);
app.controller('ControllerTwo', ['$scope', '$rootScope') {
$scope.$on("my-event", function() {
console.log("Event hit!");
})
}]);
我的ControllerOne
是我的路线的控制器,我的ControllerTwo
是通过ng-include
在该页面上加载的视图的控制器。
因此,首先调用ControllerOne
,然后在ControllerTwo
初始化时稍后调用ng-include
。
如何在不使用ControllerTwo
之类的hacky方法的情况下,从ControllerOne
将事件初始化为$timeout
?有没有更好的方法来解决这个问题,而不是使用$broadcast
?
答案 0 :(得分:1)
有没有更好的方法来解决这个问题,而不是使用$ broadcast?
我认为答案很可能是“是”,但在不知道你正在播放的内容及其原因的情况下,很难知道。
例如,目前,您在控制器运行后立即广播事件。是否有理由不能执行以下操作(独立于ControllerOne
):
app.controller('ControllerTwo', ['$scope', '$rootScope') {
if(someVar) {
console.log("Event hit!");
}
}]);
我怀疑您可能会建议someVar
只能在ControllerOne
中访问,此时我建议您通过服务访问它并使用该方法。
如果您提供一些关于您正在尝试实现的内容的更多背景信息,我会更新答案,使其更加具体。
答案 1 :(得分:1)
你可以从下控制器翻转它并$emit
:
app.controller('ControllerOne', ['$scope', '$rootScope') {
$scope.$on("checkForSomeVar", function(event, data) {
if(someVar){
data();
}
});
}]);
app.controller('ControllerTwo', ['$scope', '$rootScope') {
$scope.$emit("checkForSomeVar", function() {
console.log("Event hit!");
});
}]);
但它听起来确实应该使用您在主控制器中设置的服务,而第二个控制器也会读取该服务。