id 未被 ngRoute 捕获

id not captured by ngRoute

我有一个简单的 Angular 路由配置,其中包含主页和一些用户配置文件。出于某种原因,当我导航到 /users/user_3 时,控制器请求用户索引路由 users.json,而不是 users/user_3.json。这导致 User 服务抱怨:"Error in resource configuration for action get. Expected response to contain an object but got an array."

这个错误向我表明 $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;
  });
});

谁能告诉我这是怎么回事?谢谢!

在这种情况下,您错误地使用了 @ 属性,并且从未真正将您的 id 传递给资源。来自 Angular Documentation:

If the parameter value is prefixed with @ then the value for that parameter will be extracted from the corresponding property on the data object (provided when calling an action method).

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

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

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