Backbone.js包含集合的模型视图?

时间:2011-12-14 08:07:11

标签: javascript backbone.js coffeescript

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

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绑定到SomeCollection的现有实例时,在调用SomeModel.fetch()时,该实例被替换并且视图不再有效。我可以在旧视图上调用remove()并实例化一个新视图但我的SomeCollectionView在现有HTML(不是从模板构建)之上分层并调用remove pull out来自DOM的元素。此外,如果我的观点可以简单地对变化事件做出反应而不是需要重建,我更愿意。

1 个答案:

答案 0 :(得分:2)

我做过像你说的那样的东西(模型中的集合)来自不同的“一面”,这里可以使用。当我有一个拥有Collection的模型时,我在模型中使用事件来创建集合。

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

  initializeCollection: ->
    if !@collection
      @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