ngResource 在 $save() 之后从 POST 响应中检索唯一 ID
Posted
技术标签:
【中文标题】ngResource 在 $save() 之后从 POST 响应中检索唯一 ID【英文标题】:ngResource retrive unique ID from POST response after $save() 【发布时间】:2013-10-06 16:14:15 【问题描述】:所以我有一个资源定义如下:
angular.module('questionService', ['ngResource'])
.factory('QuestionService', function($http, $resource)
var QuestionService = $resource('/api/questions/:key', ,
query:
method:'GET',
isArray:true,
,
save:
method: 'POST',
);
return QuestionService
);
稍后我会输入一些表单并执行以下操作
var newQ =
txt: $scope.addTxt
;
QuestionService.save(newQ)
服务器通过重新发出对象的 JSON 并使用新的唯一 ID 设置位置标头来响应 POST 请求。问题是 Angular 没有将返回的 JSON 或位置标头保存到对象中,并且没有使用来自服务器的 ID 进行设置以供将来操作。我尝试了很多方法,例如:
transformResponse: function(data, headersGetter)
locationHeader = headersGetter().location;
key = locationHeader.split('/').slice(-1)[0];
data.key = key;
return data;
但是返回的数据项似乎没有被使用。我错过了什么吗?这似乎是与 REST api 交互的一个非常常见的用例。
谢谢!
【问题讨论】:
【参考方案1】:您需要有一个成功处理程序来手动将新 id 分配给newQ
:
QuestionService.save(newQ, function(data)
newQ.id = data.id;
);
但是有更好的方法来实现相同的目标。因为你的QuestionService
是一个资源类对象,你可以像这样实例化你的newQ
:
var newQ = new QuestionService(text: $scope.addTxt);
然后,拨打$save()
的newQ
:
newQ.$save();
现在newQ
应该有服务器返回的新 id。
【讨论】:
谢谢!甚至没有意识到这种语法是可用的。 有什么办法可以防止 $save 用响应覆盖资源?例如,我有一个用户资源 $scope.user。如果我调用 $scope.user.$save() 并且服务器以“Success”响应,ng-resource 会将 $scope.user 设置为“Success”一词。有什么办法可以防止吗?我的后端只返回新用户的 ID,我想在成功回调中手动更新:$scope.user.id = response.id,我不希望将整个用户对象传回的额外开销在响应中。【参考方案2】:我有运行 WebApi2 的 Asp.Net 服务器,我使用 Ok(number) 返回内容,并返回例如“6”作为结果。一旦它返回,角度显示一个包含承诺和状态的对象,以及原型和深度重复的层次结构,但没有值,没有“6”。 所以我去看看数据的去向,为了查看数据在哪里我定义了一个转换,我看到了数据,但它不是一个 json...
后来我把它改成following,现在我的成功函数中有一个obj,它有一个名为'returnValue'的子属性(正如我定义的那样),这个对象保存我的值。
transformResponse: function(data, header)
var obj=;
obj.returnValue=angular.fromJson(data);
return obj;
,
【讨论】:
以上是关于ngResource 在 $save() 之后从 POST 响应中检索唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 angularjs 中使用 Restful。我使用了 ngResource 但它不起作用。如果我使用 ngResource,js 文件 nt 正在执行