【问题标题】:How do I tell backbone that the model is not new我如何告诉骨干模型不是新模型
【发布时间】:2012-04-11 16:31:41
【问题描述】:

我有一个对象也保存在服务器中,我正在从该对象创建一个主干模型。

但是当我保存模型时,它正在执行 PUT 请求,这不是我想要的。如何告诉 Backbone 数据已经在服务器中而不进行获取?

【问题讨论】:

标签: javascript backbone.js backbone-model


【解决方案1】:

Backbone 通过checking if an id is set 确定模型的新鲜度:

是新的 model.isNew()

这个模型已经保存到服务器了吗?如果模型还没有id,则认为它是新的。

当你保存模型时,

  • 如果是新的,会发出一个 POST 请求,
  • 如果是更新(已设置id),会发送PUT请求

Backbone Sync documentation


正如 @JayC 在 cmets 中所指出的:

如果出现 id 不能是 id 的问题,您可以使用 idAttribute 来说明哪个是“身份”或关键字段。

【讨论】:

  • 注意,如果出现 id 不能是 id 的问题,您可以使用 idAttribute。 documentcloud.github.com/backbone/#Model-idAttribute 表示哪个是“身份”或关键字段。
  • 一个问题:我有一个新模型(没有 id),但它在前端设置了其他字段。当我保存模型时,它正在发送一个 PUT 请求。不应该因为没有ID就发送POST请求吗?
  • @archmage 奇怪,应该是 POST。检查这个 Fiddle jsfiddle.net/jq98Z ,它重现了预期的行为。也许您在某处覆盖了默认同步或操作映射?
  • 我的模型在保存之前就有一个 id。但 isNew 仍然有效
  • @jlei 检查您是否设置了 idAttribute 或 isNew 覆盖。如果没有,请发布问题
【解决方案2】:

在这里加上我的两分钱,希望它避免我不得不做的一些头发拉扯。

通过构造函数直接将模型的 id 属性设置为 false 或 null 将无法解决问题,您必须通过 delete 将其从内存中实际删除

例如,我只是努力将属性从一种模型类型复制到另一种类型作为新模型:

copy = Trip.clone()
#doesn't unset the id attribute
schedule = new models.Schedule(_.extend(copy.attributes, {id:null, trip_id:id})
#does unset the id attribute
delete schedule.id
schedule.save null, success: =>
  # back from POST vs PUT   
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2013-10-14
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多