2015-05-13 58 views
2

我在我的模型编写下面的代码POST:骨干同步问题射击,而不是PUT

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”不存在。

我是很新的骨干,我想知道是否有无论如何与服务器同步,而无需通过一个ID?我怎么解决这个问题? 我基本上想要释放一个PUT请求而不是URL的发布请求。(由于我的后端只支持PUT请求)。

+0

'方法:'PUT'' ?? – Zee

+0

我应该在哪里添加此方法?我应该做这个.model.save({type:'PUT'}),但它仍然会触发POST。请告诉我,我在哪里放这个方法? @ Sourabh- –

+0

虽然它是重复的,但没有得到答案[backbone-model-save-being-cause-post-not-put](http://stackoverflow.com/questions/11587217/backbone-model-save -is-cause-post-not-put) – dbf

回答

3

强制Backbone.Model.save()PUT的唯一方法是@dbf的解释方式,你必须设置你的idAttribute。要正确设置idAttribute您的型号应该具有唯一的属性。 (这不是一个硬性要求,因为model.isNew()只检查你的模型有你提供给你的模型idAttribute财产财产命名id或任何字符串,它不检查的唯一性)。

我感觉到你的情况,你可能不会在你的机型独特的属性,所以设置idAttribute可能是一个挑战。出于这个原因,我建议你不要在模型定义中指定idAttribute。相反,我们只处理它dynamically.Just重构你这样的代码:

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 
     }); 
    } 
} 
0

您可以覆盖save method。 喜欢的东西

var model = Backbone.Model.extend({ 

     save: function(options){ 
      return Backbone.sync("update", this, options); 
     } 


    }); 
2

这不是真的清楚,我要保存什么。你用POST处理的事实表明它有一个新的条目。从docs引用此行为是正确的。 PUT是更新,POST是创建(在CRUD操作下)。

如果模型是否新款,保存将是一个“创造”(HTTP POST),如果 模型在服务器上已经存在,节省将是一个“更新”(HTTP PUT )。

您可能会尝试的是@Sami通过覆盖保存更新请求(意识到所有解决方案均为错误/解决方法)的建议。

如果你真的需要PUT和不能改变你的后台对于某些神秘的原因,接受POST,你可以在模型中修改idAttribute。

var smsModel = Backbone.Model.extend({ 
    idAttribute: "smsauth" // for example 
}); 

一定要明白,你的后台,很可能,有一个设计缺陷,你正在改变和创造的解决方法与它的工作,你应该考虑避免。

2

我已经使用这个片段。

this.save({}, { 
    type: 'PUT' 
}); 

我发现你所有的答案真的很吸引人,我会尝试每个人。

感谢您的建议,这就是为什么我喜欢SO。一些新的学习。