【问题标题】:Backbone trying a put instead of a post主干尝试放置而不是发布
【发布时间】:2015-03-14 13:15:45
【问题描述】:

出于某种奇怪的原因,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();
        }
    });

即使在“强制”未定义 model.id 和 model._id 之后,Backbone 仍会尝试执行 HTTP PUT。这怎么可能?

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    同步过程在内部使用Model#isNew 来决定它应该PUT 还是POST。 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 属性才能使您尝试执行的操作。

    【讨论】:

    • 好吧,我在我的模型中定义了我的 idAttribute 为 _id,所以设置 _id 应该会影响它,对吧
    • 如果您有idAttribute: '_id',那么您需要m.unset('_id')delete m.id。但是,您尝试做的事情对我来说还是有点奇怪,看起来您在尝试重用现有模型实例时应该创建一个新实例。
    • 不,我正在向新视图实例发送一个新模型对象,这就是它如此令人困惑的原因
    • 如果它是一个新模型那么为什么它有一个id?保存新模型时,id 应该来自服务器。
    • var copy = new Model(_.omit(m.attributes, m.idAttribute)); 将避免使用toJSON 和删除 id 的需要。
    【解决方案2】:

    这很奇怪,它看起来应该从您的代码中进行 POST。看起来你可以覆盖它。来自second answer这里

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

    【讨论】:

    • 是的,谢谢,我看到了,但总的来说,我不想强​​求,发生这种情况一定有充分的理由。
    【解决方案3】:

    使用下面的代码 sn-p 将 id 设置为 undefined。

    this.model.set('id',undefined');
    

    虽然如果它是一个新模型,你不需要这样做。默认情况下它将是未定义的。 如果你已经使用 idAttribute 来定义模型并说它的值是 userId 那么你需要做这样的事情。

    this.model.set('userId',undefined');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-02
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多