Backbone尝试put而不是帖子

时间:2015-03-14 04:09:08

标签: javascript backbone.js

由于一些奇怪的原因,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。怎么会这样?

3 个答案:

答案 0 :(得分:3)

同步过程在内部使用Model#isNew来决定它是应该PUT还是POST。 isNew非常简单:

  

isNew model.isNew()

     

[...]如果模型还没有id,则认为它是新的。

check is done using

!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');