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 正在执行

链接 ngResource $promise 成功和错误

AngularJS ngResource 不发送自定义标头

ngResource和REST介绍

根据所选项目在 ngResource (angularjs) 中查询数据

与 ngResource 相比,使用 Restangular 有啥优势?