Angularjs 如何使控制器等待app.run完成
在我的应用程序中,我使用$http.get()在app.run中获取一些数据 此操作的结果需要转到控制器。 当前,我的控制器在完成此$http.get之前正在执行 在执行$http.get()之后,如何使控制器执行Angularjs 如何使控制器等待app.run完成,angularjs,angular-http,Angularjs,Angular Http,在我的应用程序中,我使用$http.get()在app.run中获取一些数据 此操作的结果需要转到控制器。 当前,我的控制器在完成此$http.get之前正在执行 在执行$http.get()之后,如何使控制器执行 run目前无法处理异步工作。见本期: 你有多种解决方案。您可以在不使用Angular的情况下获取数据并手动启动Angular() 或者,您可以使用路由解析来执行此操作:您可以使用角度范围事件。获取数据时,您可以从$rootScope向所有控制器广播事件,并在目标控制器中接收此事件。您
run
目前无法处理异步工作。见本期:
你有多种解决方案。您可以在不使用Angular的情况下获取数据并手动启动Angular()
或者,您可以使用路由解析来执行此操作:您可以使用
角度范围事件。获取数据时,您可以从$rootScope
向所有控制器广播事件,并在目标控制器中接收此事件。您可以使用$rootScope.$broadcast()运行并在控制器中使用$rootScope.$on()
app.run(function ($rootScope, $http, $cookies) {
var currentLanguageId = angular.fromJson($cookies.get('mykey')).UserInfo.Country;
$http.get('myurl').then(function (serviceInfo) {
$rootScope.serviceURL = serviceInfo.data.serviceURL;
$rootScope.$broadcast('serviceInfoReceived')
}, function (error) {
alert('error service info');
});
});
在控制器中
app.controller ('myCtrl' , function($rootScope) {
$rootScope.$on("serviceInfoReceived", function(){
console.log($rootScope.serviceURL)
});
})
希望这对您有所帮助。这是一个老问题,但是$rootScope.$on解决方案并不总是有效。这将取决于控制器注册侦听器的时间。我发现有效的方法是设置$rootScope属性,然后配置递归超时以等待设置
function waitForRun() {
if($rootScope.runFinalized){
// do something
} else {
$timeout(waitForRun, 500)
}
}
waitForRun();
在最后一个.run块之后:
.run(function($rootScope) { $rootScope.runFinalized = true; })
很难看,但很管用
.run(function($rootScope) { $rootScope.runFinalized = true; })