2014-11-14 42 views
3

我想在視圖獲取呈現之前設置一個視圖上的解決方案來獲取一些用戶信息,因爲來自API的數據將決定他們用戶將看到的視圖。我試圖把我的服務到解決,但$stateParams並不時設置出於某種原因裏面的服務:

.state('order.sharepoint', { 
    url: '/sharepoint', 
    abstract: true, 
    controller: 'SharePointController', 
    resolve: { 
     OrderResolve: function(Order, $stateParams){ // Here $stateParams 
      return Order.fetch();     // is set correctly! 
     } 
    } 
}); 

訂購服務

app.factory('Order', function ($q, API, $stateParams) { // HERE $stateParams 
                 // is empty for some reason 

    var Order = null; 
    var service = {}; 

    service.fetch = function() { 
     /// Here is my API call and everything 
    } 
+0

爲什麼不傳遞'$ stateParams'到'service.fetch'作爲參數? – SteamDev 2014-11-14 22:21:56

+0

我最終這樣做了,但我仍然想知道爲什麼其他方式無法正常工作。 DI應該解決我必須將它傳遞給fetch()函數的問題。 – 2014-11-14 22:26:01

+0

$ stateParams僅在正確的URL被擊中時才被填充。你可以試試$ state.params? – Ralph 2014-11-14 22:31:03

回答

0

is a plunker,這是realted這個問題: Angular and UI-Router, how to set a dynamic templateUrl。在那裏,我們可以看到如何使用$stateParamsfactories

一般來說,工廠,創建一次。這是一個單身人士。隨着國家的到來,決心被多次解僱。 (雖然已經創建創建的工廠......它的構造不會爲重用的最佳場所/復位

這將是一些工廠DEF:

.factory('GetName', ['$http', '$timeout', 
    function($http, $timeout) { 
     return { 
     get : function(id) { 
      // let's get data via $http 
      return $http 
      .get("dataFromServer.json") 
      .then(function(response){ 

       // simplified converter 
       // taking the $http result and 
       // by id gets the name 
       var converter = response.data; 
       var name = converter[id]; 

       return {templateName : name}; 
      }); 
     }, 
     }; 
    } 
]); 

我們可以看到,它的構造函數接受服務的引用,這些服務可以在後面經常在方法中使用。在這種情況下:get(id)

這是resolver內的標準調用它 - 即使是在templateProvider在這個例子中或。

$stateProvider 
    .state('parent.child', { 
     url: '/child/:someSwitch', 
     views: { 
     "page": { 
      templateProvider: function($http, $stateParams, GetName) { 

      // async service to get template name from DB 
      return GetName 
       .get($stateParams.someSwitch) 
       // now we have a name 
       .then(function(obj){ 
        return $http 
         // let's ask for a template 
         .get(obj.templateName) 
         .then(function(tpl){ 
          // haleluja... return template 
          return tpl.data; 
        });  
       }) 

      }, 
      controller: 'viewCtrl', 
     } 
     } 
    }); 

這個例子應該表明,該factory,可以使用IoC與相關服務/工廠注入。狀態相關的東西,這正在改變(即不是一個單身人士)必須通過爲factory方法參數...檢查它here

相關問題