为什么ngResource将保存的对象修改为:g {0:"O",1:"K",..}收到响应后

Cap*_*paj 2 javascript rest angularjs

我有一个默认的ngResource定义如下:

var Posts = $resource('/posts/');
Run Code Online (Sandbox Code Playgroud)

在我从我的nodejs服务器获得一个博客帖子之后:

$scope.post = Posts.get({_id:query._id});
Run Code Online (Sandbox Code Playgroud)

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

$scope.post.$save();
Run Code Online (Sandbox Code Playgroud)

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

g {0: "O", 1: "K", $get: function, $save: function, $query: function, $remove: function, $delete: function}
Run Code Online (Sandbox Code Playgroud)

为什么?有什么理由吗?字母"O"和"K"是否表示操作成功并返回响应200?如果不从头开始编写自己的save方法,我能否修改此行为?

Jas*_*den 8

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

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

这是你应该改变的:

var Posts = $resource('/posts/:_id');
Run Code Online (Sandbox Code Playgroud)

然后:

$scope.post = Posts.get({_id: query._id});
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话:

$scope.post.$save();
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,如果您的服务器在正文中返回"OK",那么您的$ scope.post现在将被返回数据吹走.解决这个问题的选项是:

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

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

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

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