2016-03-13 25 views
1

我知道已經有一個類似的問題Angular-UI Router - Resolve not waiting for promise to resolve?但不完全像我的問題。Angular-UI路由器 - 解決不等待承諾解決應有的狀態切換

我有兩種狀態:

.state('entities', { 
    url: '/', 
    ... 
    resolve: { 
     data: function (xyzService) { 
      return xyzService.listEntities(); 
     } 
}) 

.state('entities1', { 
    url: '/entities1', 
    ... 
    resolve: { 
     data: function (xyzService) { 
      return xyzService.listEntities(); 
     } 
}) 

而且這兩個州的要求或依賴於實體()同一集合,這是我從xyzServce.listEntities返回。這個服務方法從它的邊返回實體的數組並返回一個promise。

所以我希望在使用它之前在控制器中有這個'數據'。 當狀態被調用時,在第一次使用控制器的「數據」時,所有工作都很完美。問題出現了,當我打電話舉例說明狀態'實體'之後的狀態'實體',並且最後狀態'實體'時,就是第一個 。 因此,在這個狀態'實體'的決心不等待解決所有依賴項,並在控制器中爲這個狀態我有'數據'沒有數組元素和$解析屬性爲false和一個空的$承諾對象。

那麼你能告訴我爲什麼這種行爲?我應該期望每次調用狀態來解決依賴問題,或者這種方式只在第一次調用頁面時按規範工作?

你能給我一些想法如何解決這個問題?

最好的問候,

請求服務的例子:

angular 
     .module(SECURITY_MODULE) 
     .factory('roleService', roleService); 

    roleService.$inject = ['$resource', 'DOMAINS', 'notificationService', '$filter']; 

    function roleService($resource, DOMAINS, notificationService, $filter) { 
     var service = { 
      ... 
      listRoles: listRoles 
      ... 
     }; 

     var roleResource = $resource(DOMAINS.api + 'roles/:id/:command/:command2', {id : '@id'}, { 
      .... 
      'listRoles': {method: 'GET', isArray: true} 
     }); 

     function listRoles(callbackSuccess, errorCallback) { 
      var roles = roleResource.listRoles(function() { 
       callbackSuccess && callbackSuccess(roles); 
      }, function(error) { 
       errorCallback && errorCallback(error); 
      }); 

      return roles; 
     } 
.... 
    return service; 
} 
+0

能否請您提供服務的實現?如何處理顯示問題的小型jsbin示例? –

+0

你好ajaegle,你現在可以看到它:) – Streetsouls

回答

3

由於在文檔中列出的資源立即返回一個值(空對象或空數組),然後提取數據並稍後分配它。

https://docs.angularjs.org/api/ngResource/service/$resource

意識到調用$資源對象方法立即返回一個空引用(對象或數組取決於IsArray的)是很重要的。一旦從服務器返回數據,現有參考將填入實際數據。這是一個有用的技巧,因爲通常資源被分配給一個模型,然後由該模型渲染。

當在控制器內部直接使用時,此功能正常工作,但對路由器的解析不起作用,因爲對於路由器庫,該值已用初始值解析。

所以@Dmitriy指出,您應該使用資源的承諾,即通過$promise字段提供的承諾。在值存在或發生錯誤之前,這不會解決。

欲瞭解更多詳情,請參閱有關該主題的偉大的職位:http://www.jvandemo.com/how-to-resolve-angularjs-resources-with-ui-router/

+1

**謝謝**它現在正確地工作:) – Streetsouls

+1

這使我的一天!謝謝。 –