骨干model.save()导致POST不把(Backbone model.save() is ca

2019-06-26 10:35发布

我有一个骨干模型:

var User = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});

我把它拿来:

var user = new User();

user.fetch();

现在,作为一个click中我的观点一个事件,我有这样的:

toggleSubscription: function () {
  user.set('subscriptions', true);
  user.save();
}

这将导致一个POST请求。 然而,记录已经存在服务器上,因为我取它(和模型实例都有一个id属性),我认为应该骨干做PUT而不是POST。 为什么会它做一个POST呢?

Answer 1:

请检查user.isNew()

看起来你创建了没有ID的新模式,这就是为什么它的尝试过程中添加它Backbone.sync

更新:

以上是完全正确的。 它确实POST ,因为它是一个新的模式(这意味着,它没有一个id)。 之前获取的模型,你需要给它一个id。 在您的例子:

var user = new User();
user.fetch();
user.save(); // in XHR console you see POST

var user = new User({ id: 123 });
user.fetch();
user.save(); // in XHR console you see PUT


Answer 2:

如果模型还没有一个ID,它被认为是新的。 - http://backbonejs.org/#Model-isNew

如果模型还没有一个ID,它被认为是新的......因此骨干网会做一个PUT请求而不是POST

这种行为可以简单地通过增加覆盖type: 'POST'您保存块:

var fooModel = new Backbone.Model({ id: 1});

fooModel.save(null, {
  type: 'POST'
});


Answer 3:

使用urlRoot属性来设置基本URL /api/user 。 然后

  1. 它会发布到/api/user ,当你保存它没有一个模型_id属性设置与
  2. 它会放到/api/user/{_id}当您保存其中有一个模型_id属性集。 请注意,它会自动追加_id值与所述基准URL。

它会寻找的价值_id属性,因为你已经设置该值idAttribute



Answer 4:

服务器响应必须是这样的:

{
  _id : 111
}

因为你设置_id作为主键。 当模型被取出验证_id值它必须有一个值:的console.log(model.get(“_ ID”));

我的想法是,你在你的骨干模式“_id”作为主键设置,但服务正在恢复你“身份证”

更新 :添加正常行为的示例代码:

var UserModel = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});
user = new UserModel({_id : 20});
user.save();
user = new UserModel();
user.save();

输出:PUT / API /用户405(不允许的方法)POST / API /用户404(未找到)

检查模式的第一个实例如何有一个ID,它试图做的PUT,但其他职位。 我无法重现您的问题,所以我的想法是,这个问题是在你的服务器响应。



Answer 5:

这可能是值得一试,如果可能emulateHTTP是真实的。 这将改变所有的投入POST与添加的_method头(您可能还需要检查它存在确认的想法)。



文章来源: Backbone model.save() is causing POST not PUT
标签: backbone.js