Angular-UI路由器 - 决定不等待承诺解决到期状态切换

时间:2016-03-13 10:21:32

标签: javascript angularjs angular-ui

我知道已经存在类似问题Angular-UI Router - Resolve not waiting for promise to resolve?但不完全像我的问题。

我有两种状态:

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

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

这两个州都要求或取决于我从xyzServce.listEntities()返回的同一个实体集合。此服务方法从其一侧返回实体中的数组并返回一个promise。

所以我希望有这样的数据'在控制器之前使用它。 当使用控制器的数据时,一切都很完美。在国家被召唤的第一次。问题来了,我先问一个例子 州实体'在那个州' entities1'之后最后陈述实体'。 因此,在州和实体的这一步骤中resolve不等待解决所有依赖关系,并且在控制器中为此状态我有数据'没有数组元素,$ resolved属性为false,空$ promise对象。

那么你能告诉我为什么会这样吗?我是否应该在每次调用状态时解决依赖关系,或者仅在调用页面时第一次通过规范工作?

你能给我一些如何解决这个问题的想法吗?

最诚挚的问候,

请求的服务示例:

    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;
}

2 个答案:

答案 0 :(得分:3)

如果您使用角度$resource,则应返回xyzService.listEntities().$promise

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

答案 1 :(得分:3)

如文档中所列,资源会立即返回一个值(空对象或空数组),然后提取数据并稍后分配它。

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

  

重要的是要意识到调用$ resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。

直接在控制器内部使用时可以正常工作,但不能解决路由器的问题,因为对于路由器库,该值已经用初始值解析。

正如@Dmitriy指出的那样,您应该使用通过$promise字段提供的资源承诺。在值存在或发生错误之前,这将无法解决。

有关详细信息,请参阅有关该主题的精彩帖子:http://www.jvandemo.com/how-to-resolve-angularjs-resources-with-ui-router/