2

我有一个这样定义的默认 ngResource:

var Posts = $resource('/posts/');

在我从我的 nodejs 服务器收到一篇博文后,如下所示:

$scope.post = Posts.get({_id:query._id});

用户对其进行了一些更改,然后我调用:

$scope.post.$save();

服务器返回响应码 200 后,我的 $scope.post 如下所示:

g {0: "O", 1: "K", $get: function, $save: function, $query: function, $remove: function, $delete: function}

为什么?有什么原因吗?字母“O”和“K”是否应该表示操作成功并返回响应 200?我是否能够在不从头开始编写自己的保存方法的情况下修改此行为?

4

1 回答 1

8

在这种情况下,对资源($get、$save 等)使用实例方法将使用从服务器返回的任何内容更新实例($scope.post)。

但我认为这里的问题比这要大一些。您的 $resource 定义不会对 .get() 方法上的 ID 属性做任何事情,因为它不在 URL 配置中。因此,服务器可能返回了一个帖子数组,因为您访问了“/posts”资源。当你执行 $save() 方法时,Angular 从一个数组开始,因此获取返回“OK”的字符串并在 $scope.post 中创建项目以匹配这些字符。

以下是您应该更改的内容:

var Posts = $resource('/posts/:_id');

然后:

$scope.post = Posts.get({_id: query._id});

现在您可以致电:

$scope.post.$save();

唯一的问题是,如果您的服务器在正文中返回“OK”,您的 $scope.post 现在将被返回数据所震撼。解决此问题的选项是:

  1. 从服务器只返回状态码,不返回正文。我认为 RESTful API 是 204,这意味着客户端版本不需要更新。

  2. 如果客户端版本需要更新(如服务器上生成的新时间戳),则返回 200 并返回更新后的 Post 对象的完整主体。

  3. 如果无法进行上述调整,请使用服务级别方法而不是实例方法:

    Posts.save({_id: query._id} , post);

于 2013-03-04T00:24:26.087 回答