【问题标题】:Backbone makes PUT request with id attributeBackbone 使用 id 属性发出 PUT 请求
【发布时间】:2014-02-10 10:10:38
【问题描述】:

当我尝试像下面这样保存现有对象时:

this.model.set('name', $('#district-name').val());
this.model.save();

Backbone 使用数据向 /api/districts/18 发出 PUT 请求

id: 18
name: "qq3324"

但 id 已经在 url 中,我不想在请求正文中发送它。

【问题讨论】:

  • 为什么这是个问题?你不能在服务器端忽略它吗?
  • 在服务器端工作验证器上,它没有传递额外的参数。这不取决于我。
  • delete this.model.id 在执行this.model.save() 之前,这将导致主干向'/api/districts' 发送发布请求。

标签: rest backbone.js put


【解决方案1】:

使用patch 选项调用save

致电model.save({ patch: true }) 发出PATCH 请求,其中仅包括已更改的 属性 - 这仅影响当前的保存调用,因此您必须记住为每个调用传递参数。此外,此磨机会导致 PATCH 请求,而不是 PUT 请求。

编写您自己的Backbone.sync 实现

Backbone.sync 被 Backbone 用于与 RESTful API 进行通信。在发出 PUT 请求时,覆盖 Backbone.sync 方法以排除 ID - 此解决方案在全球范围内有效。有关此方法的实现,请参见 Backbone 注释源:http://backbonejs.org/docs/backbone.html#section-130

覆盖模型的toJSON 方法

Backbone.sync 调用模型的model.toJSON 方法,该方法传递一个选项对象(与您提供给model.save 函数的选项对象相同)。您可以覆盖此函数以获取指示应排除 ID 的参数。如果您始终扩展 BaseModel 而不是 Backbone.Model,这可以全局工作。

    var BaseModel = Backbone.Model.extend({
        toJSON: function (options) {
            var data = _.clone(this.attributes);

            if (options.excludeId) {
                data = _.omit(data, 'id');
            }

            return data;
        }
    });

    var SomeModel = BaseModel.extend({});
    new SomeModel({ ... }).save({ excludeId: true });

或者...

或者,忽略服务器端的 ID。

【讨论】:

  • 这只是一个可行的建议 - 根据您的需要,第二个或第三个选项可能比第一个更适合您。正如您所说,您对后端没有任何影响,要问的问题是“我的后端可以处理 PATCH 请求吗?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多