延迟加载控制器,直到服务器解析响应,没有ui-router(Angular)

时间:2016-04-29 04:14:15

标签: angularjs

在应用程序中显示每个图表的控制器。

在以前的版本中,每个控制器都发出单独的服务器请求来获取数据。但我希望将这些组合成一个请求并在控制器之间共享。

所以我尝试将请求移到.run()块中,然后将响应附加到$rootScope,以便所有控制器都可以访问它。

.run(['$rootScope', 'factoryName', function($rootScope, factoryName) {
    factoryName.getAll().success(function(data) {
        $rootScope.data = data;
    });
}])

问题在于它是一个异步请求,因此控制器会在响应从服务器返回之前尝试从$rootScope加载数据,并使应用程序崩溃。

通常我会使用resolve中的$stateProvider来获取状态加载前的响应,但应用程序只使用angular来使前端动态,并且没有多个状态,所以我会喜欢避免ui.router

有没有办法延迟加载控制器,直到响应回来?

1 个答案:

答案 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服务的函数进行排队,服务将延迟调用函数,等待数据到达。