在应用程序中显示每个图表的控制器。
在以前的版本中,每个控制器都发出单独的服务器请求来获取数据。但我希望将这些组合成一个请求并在控制器之间共享。
所以我尝试将请求移到.run()
块中,然后将响应附加到$rootScope
,以便所有控制器都可以访问它。
.run(['$rootScope', 'factoryName', function($rootScope, factoryName) {
factoryName.getAll().success(function(data) {
$rootScope.data = data;
});
}])
问题在于它是一个异步请求,因此控制器会在响应从服务器返回之前尝试从$rootScope
加载数据,并使应用程序崩溃。
通常我会使用resolve
中的$stateProvider
来获取状态加载前的响应,但应用程序只使用angular来使前端动态,并且没有多个状态,所以我会喜欢避免ui.router
。
有没有办法延迟加载控制器,直到响应回来?
答案 0 :(得分:2)
您可以从工厂存储承诺,然后从承诺中链来延迟使用数据的函数。
.run(['$rootScope', 'factoryName', function($rootScope, factoryName) {
//Store promise
$rootScope.dataPromise = factoryName.getAll();
}])
在控制器中使用承诺:
$rootScope.dataPromise.then(function onFulfilled(result) {
var data = result.data;
//Use data here
});
通过使用.then
方法对具有$q
服务的函数进行排队,服务将延迟调用函数,等待数据到达。