id未被ngRoute捕获

时间:2015-03-02 01:33:15

标签: angularjs ngresource ngroute

我有一个简单的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;
  });
});

谁能告诉我发生了什么事?谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您正在使用@属性,并且从未实际将id传递给资源。来自Angular Documentation

  

如果参数值以@为前缀,则该参数的值将从数据对象的相应属性中提取(在调用操作方法时提供)。

在您的情况下,您还没有对象,因为这是GET调用,因此没有对象可以从中提取id。您对get()的致电主要是请求所有User个对象。 @更适合PUTPOSTDELETE动词。

要更正代码,请将控制器更改为以下内容:

angular.module('amn.controllers')
    .controller('UserCtrl', function($scope, $routeParams, User) {
    return User.get({id: $routeParams.id}, function(data) {