ngResource 在 $save() 之后从 POST 响应中检索唯一 ID

ngResource retrive unique ID from POST response after $save()

本文关键字:响应 POST 检索 ID 唯一 之后 save ngResource      更新时间:2023-09-26

所以我有一个资源定义如下:

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 交互的一个非常常见的用例。

谢谢!

您需要

有一个成功处理程序来手动将新 id 分配给newQ

QuestionService.save(newQ, function(data) {
    newQ.id = data.id;
});

但是有一个更好的实现相同的目标。由于QuestionService是资源类对象,因此可以像这样实例化newQ

var newQ = new QuestionService({text: $scope.addTxt});

然后,致电newQ $save()

newQ.$save();

现在newQ应该有服务器返回的新 id。

我有 Asp.Net 运行 WebApi2 的服务器,我使用 Ok(number) 返回内容,结果返回例如"6"。 返回后,角度显示一个包含承诺和状态的对象,原型和深度重复的层次结构,但没有值,没有"6"。所以我去看数据去哪里,为了看到数据在哪里,我定义了一个转换,我看到了数据,但它不是 json......

后来我把它改成 follow,现在我的成功函数中有一个 obj,它有一个名为 'returnValue' 的子属性(如我所定义),这个对象保存我的值。

transformResponse: function(data, header){
    var obj={};
    obj.returnValue=angular.fromJson(data);
    return obj;
},