【问题标题】:Is it possible to change the model of a Backbone.Collection at runtime是否可以在运行时更改 Backbone.Collection 的模型
【发布时间】:2014-01-08 10:47:06
【问题描述】:

有没有一种干净的方法可以在运行时更改 Backbone 集合的模型?换句话说,我有一个名为BaseCollection 的集合,默认情况下它的模型名为BaseModel。该模型充当其他模型的基类。说AModelBModel

现在,在运行时,基于特定参数的集合需要了解它是否必须调用 BaseModelparse 方法(具有特定覆盖)或模型中使用的 parse 方法之一扩展自BaseModel

通常,这可以在我每次实例化集合时简单地扩展集合。因此,例如,默认情况下定义如下。

var BaseCollection = Backbone.Collection.extend({

    model : BaseModel,

    // other stuff here
});

现在,如果我想要一个集合,其中 AModel 必须是 model

BaseCollection.extend( { model: AModel } );

这里是复杂的东西。如果集合不包含相同类型的模型怎么办。换句话说,如果BaseCollection 包含AModels、BModels 等怎么办?请注意,我需要为每个模型调用 parse 方法,因为它们略有不同。

【问题讨论】:

    标签: javascript backbone.js collections


    【解决方案1】:

    创建不同模型集合的magic 是通过实现model 函数。

    这里是来自http://backbonejs.org/#Collection-model的例子

    var Library = Backbone.Collection.extend({
    
      model: function(attrs, options) {
        if (condition) {
          return new PublicDocument(attrs, options);
        } else {
          return new PrivateDocument(attrs, options);
        }
      }
    });
    

    在您的情况下,您应该使用属性来决定要创建的模型

    【讨论】:

    • 谢谢。 +1。我从文档中完全错过了它。如果condition 来自后端返回的数据,我可以继续应用吗?换句话说,在哪里可以找到condition?来自attrsoptions 还是其他地方?
    • @flexaddicted 条件可以来自属性、选项、集合状态、标志或您拥有的任何其他synchronous 代码
    • 因此,例如,在 attrs 中,我将找到从属于特定模型的请求返回的属性。是吗?
    • @flexaddicted 是的,你需要找到一些属性(来自 attrs)来区分一个模型到另一个模型
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2021-03-13
    • 2019-06-06
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多