由于一些奇怪的原因,Backbone正在尝试放置我的模型对象而不是将其发布到服务器。
错误是HTTP 500错误,因为Backbone正在尝试放置一个没有id的模型(因为我已将其定义为未定义):
PUT /api/teams/undefined 500 285ms - 135b
这是我的代码:
this.model.id = undefined;
this.model._id = undefined;
teamCollection.add(this.model);
this.model.save(null,
{
success: function (model) {
$('.top-right').notify({
message: {text: ' New team added! '},
type: 'info',
fadeOut: {
delay: 3500
}
}).show();
window.userHomeMainTableView.render();
}
,
error: function (model) {
teamCollection.remove(model);
$('.top-right').notify({
message: {text: ' Error adding team :( '},
type: 'danger',
fadeOut: {
delay: 3500
}
}).show();
}
});
即使在“强制”模型.id和model._id未定义之后,Backbone仍然会尝试执行HTTP PUT。怎么会这样?
答案 0 :(得分:3)
同步过程在内部使用Model#isNew
来决定它是应该PUT还是POST。 isNew
非常简单:
isNew
model.isNew()
[...]如果模型还没有
id
,则认为它是新的。
!this.has(this.idAttribute)
has
method只是attr
的简单包装:
has: function(attr) {
return this.get(attr) != null;
}
所以这些都无关紧要:
this.model.id = undefined;
this.model._id = undefined;
当Backbone决定进行PUT或POST时,那些不会真正删除id
属性的人会破坏你的模型。
我认为您最好不要复制模型(没有id
)并保存副本:
var data = m.toJSON();
delete data.id;
var copy = new Model(data);
或者更好的是,创建一个全新的模型,用数据填充它,然后保存新的模型实例。
我认为您需要unset
id
属性,并手动删除id
属性以制作您尝试工作的内容。
答案 1 :(得分:1)
奇怪的是它应该从你的代码中执行POST。虽然看起来你可以淘汰它。从second answer这里
fooModel.save(null, {
type: 'POST'
});
答案 2 :(得分:-1)
使用以下代码段将id设置为undefined。
this.model.set('id',undefined');
虽然如果它是一个新型号,你不需要这样做。它默认是未定义的。 如果您已使用idAttribute定义模型并说它的值是userId,那么您需要执行类似的操作。
this.model.set('userId',undefined');