Javascript 角度广播初始化太早

Javascript 角度广播初始化太早,javascript,angularjs,Javascript,Angularjs,我试图在页面加载时向另一个控制器广播事件。虽然接收广播的控制器尚未初始化,因此未对事件作出反应 app.controller('ControllerOne', ['$scope', '$rootScope') { if(someVar) { $rootScope.$broadcast("my-event"); } }]); app.controller('ControllerTwo', ['$scope', '$rootScope') { $scope.

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

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!");
    })
}]);
My
ControllerOne
是我路线的控制器,My
ControllerTwo
是通过该页面上的
ng include
加载的视图的控制器

因此,首先调用
ControllerOne
,然后在初始化
ng include
时调用
ControllerTwo

如何从
ControllerOne
将事件初始化为
ControllerTwo
,而不使用诸如
$timeout
之类的黑客方法?有没有更好的方法来代替使用
$broadcast

有没有更好的方法来代替$broadcast

我想答案可能是肯定的,但是如果不知道你到底在广播什么以及为什么,很难知道

例如,此时,只要控制器运行,您就在广播事件。有什么原因不能只执行以下操作(独立于
ControllerOne
):

我想您可能会建议只能在
ControllerOne
中访问
someVar
,在这一点上,我建议您通过服务访问它,并改用这种方法


如果您提供更多关于您试图实现的具体内容的上下文,我将更新答案,使其更加具体。

您可以将其翻转过来,并从较低的控制器中执行
$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!");
    });
}]);

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

从第一个控制器设置服务中的数据,然后在第二个控制器中读取该数据。这样做的方式是@SaurabhAhujaHey Ed。我正在处理一个相当复杂的项目,所以将是一个任务,张贴所有的代码!基本上,我有一个
ng include
,它允许我只在页面上包含一个小部件,它会自行处理。不幸的是,我无法在
ControllerOne
中进行任何处理,因为在
ControllerTwo
中必须完成所有操作。长话短说,我试图向
ControllerTwo
广播一个事件,让它知道何时运行特定功能。可能只是创建一个共享服务,并在那里从
ControllerOne
设置一个布尔值,然后用
ControllerTwo
读取它。可能是最优雅的方法。我不是建议在
ControllerOne
中执行任何操作-只需将
someVar
检查移动到
ControllerTwo
。哦,好吧,读错了,抱歉。由于特定原因,
someVar
变量必须保存在
ControllerOne
中。我应该说对不起。
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!");
    });
}]);