Javascript 主干同步问题触发柱而不是PUT

Javascript 主干同步问题触发柱而不是PUT,javascript,jquery,backbone.js,underscore.js,marionette,Javascript,Jquery,Backbone.js,Underscore.js,Marionette,我在模型中编写了以下代码: 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 back

我在模型中编写了以下代码:

 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的post请求。(因为我的后端只支持PUT请求)。

您可以覆盖
保存方法。
差不多

   var model = Backbone.Model.extend({

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


   });

我不太清楚你在存钱。事实上,你正在处理的邮政表明,这是一个新的条目。引用《圣经》中的话,这种行为是正确的。PUT是更新,POST是创建(在CRUD操作下)

如果模型是新的,那么保存将是“创建”(HTTP POST),如果 服务器上已存在模型,保存将是“更新”(HTTP) 放置)

您可以尝试@Sami所建议的方法,即使用更新请求覆盖保存(请务必意识到此处的所有解决方案都是错误的/解决方法)

如果您确实需要PUT,并且由于某种神秘的原因无法更改后端以接受POST,那么可以在模型中更改idAttribute

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

意识到你的后端,很可能在你正在改变的地方设计一个设计缺陷来处理它,你应该考虑避免。

< P> >强制<代码>主干。model .SaveE()/代码>做一个<代码>放置/<代码>是<代码> @ DBF< /COD>解释的,你必须设置你的ID属性。要正确设置
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
         });
     }
}

我用过这个片段

this.save({}, {
  type: 'PUT'
});
我发现你所有的答案都很吸引人,我将尝试所有答案


谢谢你的建议,这就是我喜欢的原因。需要学习的新内容。

我应该在哪里添加此方法?我应该这样做吗?model.save({type:'PUT'})但它仍然会触发POST。请告诉我这个方法放在哪里@苏拉布虽然这是一个复制品,但没有得到回答@DarkKnight。在您的AJAX调用中,比如
data:value,method:'PUT',
…@Sourabh-我的重点不是使用.AJAX调用,而是使用backbone.save。我不想使用ajax调用。是否有我可以保存且仅fire PUT not post的方法?@dbf他们在创建模型实例时隐式声明了一个ID。我已经试过了,但是它触发了对/url/sms/1(id:1)的API put请求,这不是我想要的。