2
我想包裝我的頭$ q角庫。在我的routeprovider中,我想從服務器獲取所有數據並將其存儲在localStorage中。但由於某種原因,這個解決方案似乎並未等待所有http請求在路由到selectMedia之前完成。從我的理解閱讀角度文檔這應該工作,但它不是。我是否完全錯誤理解了這個概念,還是我的想法是對的?
$routeProvider.
when('/', {
redirectTo : '/selectMedia',
resolve: {
data: function ($q, backendApi, localStorage, network, route, loginService){
var prices = function() {
var defer = $q.defer();
backendApi.prices.get(function (data) {
localStorage.setItem("videoPrice", data.VideoPrice);
localStorage.setItem("imagePrice", data.ImagePrice);
localStorage.setItem("prices", data.SliderPrices);
localStorage.setItem("priceSuffix", data.PriceSuffix);
defer.resolve();
}, defer.resolve);
return defer.promise;
};
var validFormats = function() {
var defer = $q.defer();
backendApi.validFormats.get(function (formats) {
localStorage.setItem("validFormats", formats);
defer.resolve();
}, defer.resolve);
return defer.promise;
};
var videoFormats = function() {
var defer = $q.defer();
backendApi.videoFormats.get(function (videoFormats) {
localStorage.setItem("videoFormats", videoFormats);
defer.resolve();
}, defer.resolve);
return defer.promise;
};
var categories = function() {
var defer = $q.defer();
backendApi.categories.get(function (data){
localStorage.setItem("categories", data.Categories);
defer.resolve();
},defer.resolve);
return defer.promise;
};
var renewToken = function() {
var defer = $q.defer();
loginService.renewToken(defer.resolve);
return defer.promise;
};
if(network.isOnline()){
var promises = [renewToken(), categories(), videoFormats(), validFormats(), prices()];
return $q.all(promises);
}
else if(!network.isOnline() && localStorage.length === 0){
route('/error');
}
}
}
});
}]);
感謝您的回覆。但解決方案似乎不會被跳過,爲什麼我需要指定一個控制器?我想要做的就是將我的數據從服務器保存在localStorage中,以便我可以在應用程序中訪問數據antwhere。 – bassen 2013-04-23 06:11:11
@bassen - 我已經更新了上面的答案。沒有控制器的情況下使用'resolve'不是'resolve'設計的目的。如果我是你,我會嘗試使用一個控制器來看看是否有所作爲,然後從那裏開始工作。 – tamakisquare 2013-04-23 15:05:35
@bassen - 我不完全確定你想如何使用你的'data'服務。我的猜測是,你希望它作爲一個單例對象,在應用程序啓動時加載,並且用戶在此之前不能訪問它。如果是這樣,你根本不需要使用'resolve'。你可以簡單地使用AngularJS服務+ promise + module.run()。這是一個[plunker](http://plnkr.co/edit/xVUHm6Ddo2Xx1b93cTDp?p=preview),演示了我的意思。代碼中有評論說明代碼正在做什麼。請注意,只有解決了承諾,我才使用'ngShow'來顯示內容。 – tamakisquare 2013-04-23 17:22:23