2016-02-12 28 views
0

我正在嘗試使用Resolve進行更抽象的操作,但無法獲得輸出結果。看起來我錯過了一些東西。AngularJS UI-Router Resolve集合

問題:我需要在加載視圖之前加載查找表數據。所以,我在ui-router中使用了resolve,這對每次查找都很有幫助。我認爲最好是將查找集合成單個對象,但它的失敗。這是代碼。

不工作的代碼:

resolve: {              
          lookups: ['GenericFactory', function(genericFactory) { 
           return { 
            StateList: genericFactory.GetStateList().then(function(response){return response.data;}), 
            EmployeeTypeList: genericFactory.GetEmployeeType().then(function(response){return response.data;}) 
           } 
          }] 
    } 

工作代碼:

resolve: {              
          StateList: ['GenericFactory', function(genericFactory) { 
           return genericFactory.GetStateList() 
          }], 
          EmployeeTypeList: ['GenericFactory', function(genericFactory) { 
           return genericFactory.GetEmployeeType() 
          }] 
    } 

回答

2

docs

依賴性的可選地圖應當注入到控制器。如果這些依賴關係中有任何一個是承諾,那麼路由器將等待它們全部在控制器實例化之前被解析。

我會說你不能讓非工作代碼工作,因爲你正在嘗試返回一個對象。由於該對象本身不是承諾,因此上述規則不適用。

也許這將工作 - 你可以火起來的這些要求,在它自己的承諾將它們包裝和返回(未經測試):

lookups: ['$q', 'GenericFactory', function($q, genericFactory) { 
    var deferred = $q.defer(); 

    var q1 = genericFactory.GetStateList().then(function(response){return response.data;}), 
    var q2 = genericFactory.GetEmployeeType().then(function(response){return response.data;}) 

    $q.all([q1, q2]).then(function (res) { 
     var obj = { 
      StateList = res[0]; 
      EmployeeTypeList = res[1]; 
     } 

     deferred.resolve(obj); 
    }); 

    return deferred.promise; 
}]