2011-12-14 125 views
1

在我的Backbone.js应用程序中,我有一个包含集合的模型。为了支持从后端获取该模型,我重写了解析方法,将JSON响应中的数组转换为集合实例。它看起来是这样的:Backbone.js包含集合的模型视图?

class SomeModel extends Backbone.Model 
    defaults: -> 
    collection: new SomeCollection([new SomeModel(attr: value)]) 

    parse: (res) -> 
    res.collection = new SomeCollection(res.collection) 
    res 

class SomeCollection extends Backbone.Collection 
    model: SomeOtherModel 

class SomeCollectionView extends Backbone.View 
    el: $('collection-view') 

我的问题是,虽然SomeCollectionView调用SomeModel.fetch()该实例被替换时,势必会SomeCollection,现有实例和视图不再有效。我可能在旧的视图上调用remove()并实例化一个新的,但我的SomeCollectionView分层在现有的HTML(不是从模板构建)之上,调用remove从DOM中取出元素。而且,如果我的观点能够对变化事件作出简单反应而不需要重建,我更愿意。

回答

2

我做了像你说的东西(模型集合)从不同的“一面”,这将在这里工作。当我有一个具有集合的模型时,我使用模型中的事件来创建集合。

class ModelA extends Backbone.Model 
    initialize: -> 
    bind("change", @initializeCollection) 

    initializeCollection: -> 
    if [email protected] 
     @collection = new Collection(@attributes.collection) 
    else 
     @collection.set(@attributes.collection) 

的其余部分是相同的,所以我不会把它放在

此外,如果你走得更深: MODELA - > collecionB - > modelB - > collectionC - > modelC 比modelB在构造函数可以创建collectionC(提供您不要重复使用它)

[编辑] 我已经有了另一个想法:

class ModelA extends Backbone.Model 
    parse: (resp) -> 
    if @attributes.collection 
     @attributes.collection.set(resp.collection) 
     delete resp.collection 
    else 
     resp.collection = new Collection(resp.collection) 
    resp 
+1

整洁。然而,这种方法的缺点是你不能调用`model.get('collection')`,而是必须调用`model.collection`。我不是非常喜欢这种不对称,但也许这是一个必要的罪恶。 – errcw 2011-12-15 05:30:53