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

时间:2013-09-30 17:34:45

标签: javascript ajax json angularjs ngresource

所以我的资源定义如下:

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

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要有一个成功处理程序来手动将新ID分配给newQ

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

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

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

然后,拨打$save()的{​​{1}}:

newQ

现在newQ.$save(); 应该有服务器返回的新ID。

答案 1 :(得分:0)

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

稍后我将其更改为以下内容,现在我的成功函数中有一个obj,它具有名为' returnValue'的子属性。 (正如我所定义的),这个对象具有我的价值。

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