【问题标题】:Backbonejs - use nested object as id attributeBackbonejs - 使用嵌套对象作为 id 属性
【发布时间】:2013-06-18 07:23:22
【问题描述】:

是否可以使用嵌套对象作为 Backbone 中的 id 属性?

例如比如,

var MyModel = Backbone.Model.extend({
        defaults : {
            'info': {
                'name': ""
            },
        },
        idAttribute: "info.name"
}

顺便说一句,上面的 ID 不能用作 ID,我在这里添加它只是为了说明我想要实现的目标。

TIA

【问题讨论】:

  • 您不能将嵌套对象用作 idattribute
  • 如果您的defaults 中有可变的东西(例如{info: { ... } } 对象),请使用defaults 函数而不是对象字面量。 defaults 是浅拷贝的,所以你最终会更改原型的 defaults 并想知道为什么你的所有模型都发生了变化。

标签: javascript backbone.js javascript-objects


【解决方案1】:

我认为您不能直接将嵌套对象分配为 idAttribute

但是你可以在parse方法中服务器提供响应时直接在模型上设置id

parse: function(response) {
   response.id = response.info.name;
   return response;
}

【讨论】:

  • 请注意,不支持嵌套 idAttributes 是设计使然,不会更改:github.com/jashkenas/backbone/pull/598
  • 这并不总是像您期望的那样工作,因为模型在集合上设置之前不会被解析。因此,调用collection.fetch({ remove: false }) 将导致重复模型。看到这个jsfiddle
【解决方案2】:

正如@Sushanth 所说,parse 肯定是实现此目的的好方法。

但通常在 Backbone 模型中使用嵌套对象是不安全的,也不是最好的方法。当您更改 response.info.name 属性并将事件绑定到 response.info 时,您将不会收到通知。

在使用 Backbone 几年后,我想告诉你,将你从服务器接收到的模型解析为原始对象是你能做的最好的事情。

如果您希望您的模型以完全相同的方式返回到服务器,您可以覆盖 toJSON 函数,该函数可以将其转换回来。当然,你需要实现这两个...:/

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多