我正在使用正则化元素并尝试保存它。如果它是一个新元素,它将以我想要的格式调用post。
但是,对于已更改的现有元素,它会尝试调用put。我正在使用的其余接口没有put命令,而是使用带有元素id的post来更新该元素。
是否有一种简单的方法可以让save方法实现我希望它使用post,使用元素id,而不是在我调用save方法时使用它?我是否必须完全覆盖该方法?
顺便说一句,我最好能告诉矩形使用POST来表示新元素,如果元素以前存在过PUT,但我不确定。任何人都可以告诉我矩形决定哪个电话适合吗?文档只是说它将'决定'要调用哪个。
编辑:
我找到了一个非常简单的解决方案,在我的情况下效果很好,因为我们连接的REST接口没有在任何地方使用PUT。我将以下行添加到初始化工厂中:
Restangular.setMethodOverriders(["put", "post"]);
实际上这改变了每次调用一个帖子调用。由于我们的格式很安静,其他的不使用Puts,这很好用。我们现在可以简单地在任何restangularized元素上调用save,它就会起作用。
答案 0 :(得分:2)
我检查了Restangular source,发现了以下内容:
function save(params, headers) {
if (this[config.restangularFields.fromServer]) {
return this[config.restangularFields.put](params, headers);
} else {
return _.bind(elemFunction, this)('post', undefined, params, undefined, headers);
}
}
因此,Restangular与您创建和重新组合的javascript对象以及通过Restangular方法获得的对象(get
方法的风格)不同。如果它是第一个使用POST
的,因为在本地重新组合元素意味着它不存在于远程位置。在第一次保存后,或者如果您从远程源提取它,它将使用PUT
。
此行为非常适合REST,因为用于创建对象的POST
和用于更新的PUT
是REST API的常用方法。有关示例,请参阅this section from Wikipedia on REST。
根据您的具体情况,(至少)有以下两种解决方案:
更新API以允许PUTs
获取更新(如果您有权访问),或者通常使用重新分类元素的post
方法。我建议不要直接更改config.restangularFields.fromServer
字段或覆盖Restangular的save
方法(尽管两者都应该有效)。