2013-04-22 85 views
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'); 
        } 
       } 
      } 
     }); 
}]); 

回答

1

我沒有在路徑定義中看到指定路由的控制器。我想你已經在視圖層面通過ngController進行了設置。當您沒有在定義中指定控制器時,跳過resolve塊。

4/23 UPDATE

從官方文檔中提取的resolve屬性的定義:

依賴性的可選地圖應注入 控制器。如果這些依賴關係中有任何一項是承諾,那麼它們將被解析並轉換爲值,然後控制器將實例化 並觸發$ routeChangeSuccess事件。

根據定義,resolve屬性的設計目的是有一種方法將依賴注入到與路由關聯的控制器中。

+0

感謝您的回覆。但解決方案似乎不會被跳過,爲什麼我需要指定一個控制器?我想要做的就是將我的數據從服務器保存在localStorage中,以便我可以在應用程序中訪問數據antwhere。 – bassen 2013-04-23 06:11:11

+0

@bassen - 我已經更新了上面的答案。沒有控制器的情況下使用'resolve'不是'resolve'設計的目的。如果我是你,我會嘗試使用一個控制器來看看是否有所作爲,然後從那裏開始工作。 – tamakisquare 2013-04-23 15:05:35

+0

@bassen - 我不完全確定你想如何使用你的'data'服務。我的猜測是,你希望它作爲一個單例對象,在應用程序啓動時加載,並且用戶在此之前不能訪問它。如果是這樣,你根本不需要使用'resolve'。你可以簡單地使用AngularJS服務+ promise + module.run()。這是一個[plunker](http://plnkr.co/edit/xVUHm6Ddo2Xx1b93cTDp?p=preview),演示了我的意思。代碼中有評論說明代碼正在做什麼。請注意,只有解決了承諾,我才使用'ngShow'來顯示內容。 – tamakisquare 2013-04-23 17:22:23