我知道已经存在类似问题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;
}
答案 0 :(得分:3)
如果您使用角度$resource
,则应返回xyzService.listEntities().$promise
答案 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/