我的用户和管理员存储在一个集合中。所有REST API操作都是相同的,但我希望能够分别查询用户列表和管理员列表。 (当我只需要管理员列表时,我不想查询完整的用户列表并在客户端中对它们进行排序)。所以在服务器端我为查询管理员制作了一个自定义URL:
/api/users
/api/users/admins
在客户端,我为Users资源创建了一个自定义方法,仅检索管理员:
// Users service used for communicating with the users REST endpoint
angular.module('users').factory('Users', ['$resource',
function($resource) {
return $resource('api/users/:userId', {
userId: '@_id'
}, {
update: {
method: 'PUT'
},
admins: {
method: 'GET',
url: 'api/users/admins',
isArray: true
}
});
}
]);
当我第一次查询()资源时,这工作正常,并且管理列表显示在users/admins
上。在我加载一个管理员(在/users/:userId
url下打开)并尝试导航回users/admins
之后,它会发送一个GET请求以获取管理列表(按预期的对象数组)和我得到以下错误:
错误:[$ resource:badcfg]操作get
的资源配置出错。包含一个对象的预期响应但得到一个数组http://errors.angularjs.org/1.3.14/ $ resource / badcfg?p0 = get& p1 = object& p2 = array
如果我点击Admin List菜单项,并按该方式加载状态,则没有错误,视图加载正常。
我还尝试创建一个单独的资源,仅用于查询管理员,但仍然存在相同的错误:
angular.module('users').factory('Admins', ['$resource',
function($resource) {
return $resource('api/users/admins');
}
]);
我做错了什么?处理这些自定义查询的正确方法是什么?
答案 0 :(得分:0)
好的,以上所有内容似乎都是正确的,事实证明问题出在$ stateProvider配置中。
由于用户视图状态的定义早于管理列表状态,/users/:userId
param在通过url查找状态而不是状态名称时选择了/users/admin
url。该状态期望单个用户对象而不是用户数组。
state('admin.users.view', {
url: '/:userId',
templateUrl: 'modules/users/views/view-user.client.view.html'
}).
state('admin.users.admins', { //extra view for listing admin profiles
url: '/admins',
parent: 'admin.users',
templateUrl: 'modules/users/views/list-admins.client.view.html'
}).
解决方案是更改顺序并更早地定义管理列表状态:
state('admin.users.admins', { //extra view for listing admin profiles
url: '/admins',
parent: 'admin.users',
templateUrl: 'modules/users/views/list-admins.client.view.html'
}).
state('admin.users.view', {
url: '/:userId',
templateUrl: 'modules/users/views/view-user.client.view.html'
}).