问题 Angular Restangular 保存和更新操作
Issues Angular Restangular save and update operations
我决定将我的项目放在 Restangular 中,但我在 SAVE 和 UPDATE 操作中遇到了一些问题。
我将 API 与 mongodb 一起使用。
在我的例子中,在保存中,我正在保存一个新的 Post,当我偶然做出任何更改时,它会保存一个新的 post 而不是更新它。
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;
});
};
在 RESTHeart 中,POST 和 PUT 是更新插入操作,即如果资源不存在则创建资源或更新资源。
这里的重点是关于_id:
- 在 PUT 操作中,文档 ID 由 URI 给出 /db/collection/id_of_document(有关 URI 格式的更多信息请参见官方文档 here)
- 在POST操作中,_id属性可以在json中指定有效载荷。如果未指定,将创建一个新文档并通过 Location 响应返回自动生成的 _id(ObjectId 类型)header.如果指定 _id,则 POST 将导致更新,前提是具有 _id 的文档已经存在。
在您的情况下,首先 POST(创建文档),您需要使用 Location 响应 header创建了 post 资源并通过 GET 操作重新加载它;进一步 POST 使用此数据(现在包含生成的 _id)将导致更新。
无论如何,当您在现有资源上执行 POST、PATCH、PUT 或 DELETE 操作时,您需要通过 If-Match请求header。您可以在官方文档的 ETag 部分找到更多信息,包括 AngularJs.
的示例
此外,github 上有一个使用 RESTHeart、AngluarJs 和 Restangular 的 Web 应用程序的完整示例:restheart-notes-example。
看看 notes.js 控制器,您会在其中找到创建、更新和删除文档的所有逻辑。
我决定将我的项目放在 Restangular 中,但我在 SAVE 和 UPDATE 操作中遇到了一些问题。
我将 API 与 mongodb 一起使用。
在我的例子中,在保存中,我正在保存一个新的 Post,当我偶然做出任何更改时,它会保存一个新的 post 而不是更新它。
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;
});
};
在 RESTHeart 中,POST 和 PUT 是更新插入操作,即如果资源不存在则创建资源或更新资源。
这里的重点是关于_id:
- 在 PUT 操作中,文档 ID 由 URI 给出 /db/collection/id_of_document(有关 URI 格式的更多信息请参见官方文档 here)
- 在POST操作中,_id属性可以在json中指定有效载荷。如果未指定,将创建一个新文档并通过 Location 响应返回自动生成的 _id(ObjectId 类型)header.如果指定 _id,则 POST 将导致更新,前提是具有 _id 的文档已经存在。
在您的情况下,首先 POST(创建文档),您需要使用 Location 响应 header创建了 post 资源并通过 GET 操作重新加载它;进一步 POST 使用此数据(现在包含生成的 _id)将导致更新。
无论如何,当您在现有资源上执行 POST、PATCH、PUT 或 DELETE 操作时,您需要通过 If-Match请求header。您可以在官方文档的 ETag 部分找到更多信息,包括 AngularJs.
的示例此外,github 上有一个使用 RESTHeart、AngluarJs 和 Restangular 的 Web 应用程序的完整示例:restheart-notes-example。
看看 notes.js 控制器,您会在其中找到创建、更新和删除文档的所有逻辑。