我有一个骨干模型:
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呢?
请检查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
如果模型还没有一个ID,它被认为是新的。 - http://backbonejs.org/#Model-isNew
如果模型还没有一个ID,它被认为是新的......因此骨干网会做一个PUT
请求而不是POST
。
这种行为可以简单地通过增加覆盖type: 'POST'
您保存块:
var fooModel = new Backbone.Model({ id: 1});
fooModel.save(null, {
type: 'POST'
});
使用urlRoot属性来设置基本URL /api/user
。 然后
- 它会发布到
/api/user
,当你保存它没有一个模型_id
属性设置与 - 它会放到
/api/user/{_id}
当您保存其中有一个模型_id
属性集。 请注意,它会自动追加_id
值与所述基准URL。
它会寻找的价值_id
属性,因为你已经设置该值idAttribute
。
服务器响应必须是这样的:
{
_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,但其他职位。 我无法重现您的问题,所以我的想法是,这个问题是在你的服务器响应。
这可能是值得一试,如果可能emulateHTTP
是真实的。 这将改变所有的投入POST与添加的_method
头(您可能还需要检查它存在确认的想法)。