2014-02-11 57 views
25

我真的需要一些數據在引導角之前加載。由於這個原因,我創建了一個run塊/在這個run塊中,我調用了一個從服務器加載一些數據的服務方法。由於這是一個異步調用,JavaScript會進一步執行,導致我的應用程序中出現一些未定義的對象。如何在Angular的Run塊中等待承諾?

我正在使用路線,但它不是與resolve屬性一起使用的選項。

有人可以提供解決方案,如何等待在run塊中準備好承諾嗎?

編輯:

由於給定的答案,我已經通過手動自舉的角度解決了這個問題:

$(document).ready(function() { 
    $.ajax('/Data/GetDropdownData', {type:'POST'}).done(function (response) { 
     app.run(['ListService', function (ListService) { 
      ListService.setData(response); 
     }]) 

     angular.bootstrap(document, ["sma"]); 
    }) 
}) 
+0

promise.then(功能(數據){$ rootScope。數據=數據; });但我認爲這太容易了^^並且您不確定是否準備好了您的控制器 – Whisher

+0

@Whisher感謝您的回覆,但這確實不是一種選擇。我真的需要在啓動應用程序之前加載數據。 – Martijn

+0

因此,也許手動引導將是一個選項http://docs.angularjs.org/guide/bootstrap

回答

3

正如我評論就放在這裏

您可以嘗試manual bootstrap

<script> 
    angular.element(document).ready(function() { 
     angular.bootstrap(document); 
    }); 
</script> 

原因在這種情況下,您不能使用cont滾筒和角度獲取數據的方式。我想你將不得不通過jQuery加載你的數據,在jquery回調中引導你的角度,然後用你從jquery獲得的數據初始化你的範圍變量。

+0

標記爲答案,因爲Fedor是第一個。 – Martijn

5

你可能想看看this SO問題 - 它顯示瞭如何用異步數據初始化AngularJS服務。

Here是一個來自該問題的示例,顯示了使用AngularJS服務(如$ http)來加載配置,然後進行進一步初始化。

This答案有很大的解釋和示出的等待DOM加載這樣一個例子(plunkr例如從答案是here):

angular.element(document).ready(function() { 
    angular.bootstrap(document); 
}); 
0

因爲我的其他解決方案無法ommit的零件我的應用程序,但我仍然需要等待的東西被加載。

引導指令(不附屬於Twitter的引導):

myApp.directive('myBootstrap', function() { 
    return { 
    scope: { 
     promise: '=myBootstrap' 
    }, 
    template: '<div ng-if="ctrl.isReady" ng-transclude></div>', 
    controllerAs: "ctrl", 
    transclude: true, 
    controller: function($scope) { 
     var ctrl = this; 
     ctrl.isReady = false; 

     //else an array of promises can be filled by a service 
     $scope.promise.then(function() { 
      ctrl.isReady = true; 
     }); 
    } 
    }; 
}); 

和相關plnkr:http://plnkr.co/edit/vx4aWS?p=preview