角度广播过早地初始化

时间:2015-08-04 11:18:35

标签: javascript angularjs

我正在尝试在页面加载时向另一个控制器广播一个事件。虽然接收广播的控制器尚未初始化,但因此没有对事件作出反应。

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

2 个答案:

答案 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!");
    });
}]);

但它听起来确实应该使用您在主控制器中设置的服务,而第二个控制器也会读取该服务。