发出Angular Restangular保存和更新操作

时间:2015-09-09 17:59:13

标签: angularjs restangular restheart

我决定把我的项目放在Restangular中,但是我在SAVE和UPDATE操作中遇到了一些问题。

我将API restheart与mongodb一起使用。

在我的案例中保存,我正在保存一个新帖子,当我偶然做出任何更改时,它会保存一个新帖子而不是更新它。

UPDATE on,我可以更新第一个实例,例如,更改标题并保存,如果我再次更新它会更新..生成此错误:

PUT http://127.0.0.1:8080/api/portfolio/55ef4b15ef862e8f7316cbf1 412(先决条件失败) 关注我的资源和代码:

Restangular.all($scope.section).getList($scope.query).then(function(res){
    $scope.items = res;
});

我的保存:

// create new object item
$scope.item = Restangular.one($scope.section);

// save object
$scope.addItem = function(){
    $scope.item.save().then(function(){
            toast.msgToast($scope.section + ' ...item criado!');
    }, function(err){
        toast.msgToast($scope.section + ' ...ocorreu um erro ao criar o item!');
    });
};

我的更新:

$scope.updateItem = function(){
        $scope.item.save().then(function(){
            toast.msgToast($scope.section+ ' #' +$scope.item._id.$oid+ ' ....Atualizado!');
        });
    };

    $scope.loadItem = function(){
        Restangular.one($scope.section, $stateParams.id).get().then(function(item) {
            $scope.item = item;
        });
    };

1 个答案:

答案 0 :(得分:3)

在RESTHeart中,POST和PUT是upsert操作,即如果资源不存在或更新资源,它们会创建资源。

这里的重点是关于_id:

  • 在PUT操作中,文档ID由URI / db / collection / id_of_document给出(有关URI格式的更多信息,请参阅官方文档here
  • 在POST操作中,可以在json有效内容中指定 _id 属性 。如果未指定,则会创建新文档,并通过 Location 响应标头返回自动生成的 _id (ObjectId类型)。如果指定了 _id ,则POST将导致更新,因为具有该 _id 的文档已存在。

在您的情况下,在第一次POST(创建文档)时,您需要获取带有创建的post资源的URI的 Location 响应头,并通过GET操作重新加载它;使用此数据进一步POST(现在包含生成的 _id )将导致更新。

在任何情况下,当您在现有资源上执行POST,PATCH,PUT或DELETE操作时,您需要通过 If-Match 请求标头传递ETag。您可以在官方文档的ETag部分找到更多信息,包括AngularJs的示例。

此外,还有一个完整的示例,表示在github上使用RESTHeart,AngluarJs和Restangular的Web应用程序:restheart-notes-example

查看notes.js控制器,您可以在其中找到创建,更新和删除文档的所有逻辑。