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!");
})
}]);
MyControllerOne
是我路线的控制器,MyControllerTwo
是通过该页面上的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!");
});
}]);