【问题标题】:id not captured by ngRoutengRoute 未捕获的 id
【发布时间】:2015-03-02 09:58:09
【问题描述】:

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

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

【问题讨论】:

    标签: angularjs ngresource ngroute


    【解决方案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) {
    

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2020-07-13
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多