2016-03-13 56 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

这使我的一天!谢谢。 –