2014-02-21 83 views
2

我在我的角度app.run()方法中調用API以獲取一些數據,然後將其附加到$rootScope - 應用程序在各個位置都需要此數據,所以這似乎對我來說是有意義的,因爲它是獲得它的地方。在繼續之前等待在AngularJS中解析的承諾

代碼是:

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需要一點時間來恢復比它需要一些控制器來執行,並建立模板的 - 在這種情況下在模板中的一些指令需要一個$rootScope.globalJSON可用。當它不是,那些指令&任何其他需要它,錯誤了。

有沒有辦法暫停應用程序,直到該承諾已履行完畢?或者我應該分離出角度和引導角度之後?

+0

'$ rootScope。$ state = $ state; $ rootScope。$ stateParams = $ stateParams;'你爲什麼要這樣做? – Gabe

+0

這是其他領域需要的 - 沒有發佈每一行代碼,儘管這部分與我的問題無關。 – Darren

回答

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; 

我想提出一個假設,即你獲取數據是指作爲將由角的綁定機制來處理的數據(從而能夠當你得到適當的globalJSON更新綁定)。

+0

感謝Rich,那會很好:) – Darren

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 

希望這將有助於有人!

相關問題