我在模型中编写了以下代码:
urlroot: '/url/sms',
setAuthId: function(value) {
var _this = this ;
if (this.get("smsauth") != value) {
this.set("smsauth",value);
this.save();
//Ideally, I want to achieve this AJAX call request with backbone.
// $.ajax({
// url: "/url/sms",
// data: value,
// type: 'PUT',
// processData: false,
// success: function(result) {
// _this.set("authId", value);
// },
// error : function(){
// console.log('Error setting authid');
// }
// });
}
},
理想情况下,我们应该每次都触发一个“PUT”请求。但是主干网正在发出POST请求,因为不存在“ID”。
我对 Backbone 还很陌生,我想知道是否仍然可以在不传递ID的情况下与服务器同步?我怎么解决这个问题?
我基本上想触发PUT请求,而不发布URL请求。 (因为我的后端仅支持PUT请求)。
最佳答案
强制Backbone.Model.save()
执行PUT
的唯一真正方法是@dbf
解释的方法,您必须设置idAttribute。要正确设置idAttribute
,您的模型应具有唯一的属性。 (这不是硬性要求,因为model.isNew()
仅检查模型是否具有名为id
的属性或提供给模型idAttribute
属性的任何字符串。它不检查唯一性。)
我认为,就您而言,您的模型中可能没有唯一的属性,因此设置idAttribute
可能是一个挑战。因此,建议您不要在模型定义中指定idAttribute
。相反,我们只是动态地处理它,只需重构您的代码即可:
setAuthId: function(value) {
var _this = this ;
if (this.get("smsauth") != value) {
// any model attribute is fine, we just need to return a prop
this.prototype.idAttribute = "smsauth"
this.save("smsauth",value) // Save will do a set before the server request
// model.save returns a promise. Here we'll reset the idAttribute
.then(/* success handler */ function (response) {
_this.set("authId",value);
_this.prototype.idAttribute = 'id' // You can set this to "authId" if that
// uniquely identifies this model
},/* error handler */ function (response) {
_this.prototype.idAttribute = 'id' // reset idAttribute to default
});
}
}