我已经在我的角度app.run()
方法中调用API来获取一些数据,然后将其附加到$rootScope
- 应用程序需要在不同的地方使用此数据,所以这似乎让我觉得这是获得它的地方。
代码是:
var app = angular.module('app', ['ngAnimate', 'infinite-scroll', 'ui.router', 'ui.bootstrap', 'app.filters', 'app.services', 'app.directives', 'app.controllers'])
.run(['$templateCache', '$rootScope', '$state', '$stateParams', '$modalStack', 'appInit', function ($templateCache, $rootScope, $state, $stateParams,$modalStack, appInit) {
// set loading to 0 for loading mask
$rootScope.loading = 0;
var globalPromise = appInit.getGlobal();//
//var globalPromise = appInit.getGlobal();
globalPromise.then(function (data) {
// attach globalJSON to rootScope
$rootScope.globalJSON = data;
});
}]);
所以,我需要在应用程序的其余部分运行之前完成globalPromise.then()
。
我遇到的问题是,有时globalPromise
需要一些控制器来执行和构建模板需要更长的时间 - 在这些情况下,模板中的某些指令需要{{1}可用。当它不是,那些指令&其他需要它的东西,错误输出。
有没有办法暂停应用程序,直到该承诺得到满足?或者我应该在角度和自举角之后将其分开吗?
答案 0 :(得分:1)
它可能不是最优雅的,但我在我的应用程序中想出了一个类似问题的解决方案,我希望在应用程序加载时从服务器检索i18n资源包。
基本思想是,虽然您的请求是异步的,但获取承诺是同步的。如果在该对象上设置占位符值,则至少可以伪造所需的引用,直到它们最终到达。从那里开始使用AngularJS的数据绑定来更新绑定到实际的承诺结果。
var globalPromise = appInit.getGlobal();//
globalPromise.then(function (data) {
// attach globalJSON to rootScope
$rootScope.globalJSON = data;
});
angular.extend(globalPromise, { /* insert your placeholder object data here */ });
$rootScope.globalJSON = globalPromise;
我假设您正在获取的数据是由Angular的绑定机制处理的数据(因此当您获得正确的globalJSON时能够更新绑定)。
答案 1 :(得分:0)
无论您解决了什么问题,我都想分享解决方案,我发现几乎完全相同的问题。
在应用程序的sturtup上,我必须使用$http
服务来获取一些数据,并且在成功回调时将这些数据保存到服务中,这些数据已被多个控制器使用。但是,有时这种异步调用在使用其数据之前还不够快。要解决这个问题,我必须使用$broadcast
服务。
这就是我的服务(在CoffeeScript中):
app.factory 'MyService', ($http, $rootScope) ->
myData = {}
service =
getData: ->
myData
setData (val) ->
myData = val
$rootScope.$broadcast('myData:updated', val)
fetchData: ->
$http.get "/url/to/data"
service
我在控制器中所要做的就是等待'myData:updated'
事件:
app.controller 'MyCtrl', ($scope, Task) ->
$scope.$on 'myData:updated', (event, data) ->
$scope.myData = data
# do whatever you like with that data
希望它会帮助别人!