应用程序中显示的每个图表都有一个控制器。
在以前的版本中,每个控制器都会发出一个单独的服务器请求来获取数据。但我想将这些合并为一个单独的请求,并在控制器之间共享。
因此,我尝试将请求移动到.run()
块中,然后将响应附加到$rootScope
,以便所有控制器都可以访问它
.run(['$rootScope', 'factoryName', function($rootScope, factoryName) {
factoryName.getAll().success(function(data) {
$rootScope.data = data;
});
}])
问题是它是一个异步请求,因此控制器试图在服务器返回响应之前从$rootScope
加载数据,并导致应用程序崩溃。
通常情况下,我会使用$stateProvider
中的resolve
来在状态加载之前获得响应,但应用程序只是使用angular来使前端动态,并且没有多个状态,所以我希望避免使用ui.router
。
有没有一种方法可以延迟加载控制器,直到响应回来?
您可以从工厂存储promise,然后从promise链接以延迟使用数据的函数。
.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
服务排队,该服务将延迟调用该函数,等待数据到达。