我有一个简单的Angular路由配置,包含主页和一些用户配置文件。出于某种原因,当我导航到/users/user_3
时,控制器会请求用户索引路由users.json
,而不是users/user_3.json
。这导致User
服务抱怨:“操作get
的资源配置出错。。包含对象但得到数组的预期响应。”
此错误向我表明$resource
知道它正在请求单个用户资源,但路由参数似乎已根据我在控制台中的摆弄而正确捕获:
> $route = angular.element(document.body).injector().get('$route')
Object {routes: Object, reload: function, updateParams: function, current: Object}
> $route.current.params
Object {id: "user_3"}
所以看起来介于捕获路径参数和实际服务请求之间的某个时刻,某些东西导致路径参数消失。
这是我的路线配置:
$routeProvider.when( '/', {
controller: 'HomeCtrl',
templateUrl: '/assets/views/home.html',
})
.when( '/users/:id', {
controller: 'UserCtrl',
templateUrl: '/assets/views/user.html',
});
我的用户服务:
angular.module('amn.services').service('User', [
'$resource', function($resource) {
return $resource('/users/:id.json', {
id: '@id'
});
}
]);
...和我的UserCtrl:
angular.module('amn.controllers').controller('UserCtrl', function($scope, User) {
return User.get(function(data) {
return $scope.user = data;
});
});
谁能告诉我发生了什么事?谢谢!
答案 0 :(得分:1)
在这种情况下,您正在使用@
属性,并且从未实际将id
传递给资源。来自Angular Documentation:
如果参数值以@为前缀,则该参数的值将从数据对象的相应属性中提取(在调用操作方法时提供)。
在您的情况下,您还没有对象,因为这是GET
调用,因此没有对象可以从中提取id
。您对get()
的致电主要是请求所有User
个对象。 @
更适合PUT
,POST
和DELETE
动词。
要更正代码,请将控制器更改为以下内容:
angular.module('amn.controllers')
.controller('UserCtrl', function($scope, $routeParams, User) {
return User.get({id: $routeParams.id}, function(data) {