【问题标题】:Backbone.js view of model containing collection?包含集合的模型的 Backbone.js 视图?
【发布时间】:2011-12-15 18:45:26
【问题描述】:

在我的 Backbone.js 应用程序中,我有一个包含集合的模型。为了支持从后端获取该模型,我重写了 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 会从DOM。此外,如果我的视图可以简单地对更改事件做出反应而不需要重建,我会更喜欢。

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

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

    class ModelA extends Backbone.Model
      initialize: ->
        bind("change", @initializeCollection)
    
      initializeCollection: ->
        if !@collection
          @collection = new Collection(@attributes.collection) 
        else
          @collection.set(@attributes.collection)
    

    其他的都一样,就不放了。

    另外,如果你更深入: 模型A->集合B->模型B->集合C->模型C 比在构造函数中的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
    

    【讨论】:

    • 整洁。然而,这种方法的缺点是您不能调用model.get('collection'),而是必须调用model.collection。我不太喜欢不对称,但也许它是一种必要的邪恶。
    • 您也可以这样做-但您必须稍微破解一下解析-这样它就不会覆盖集合属性:)-嗯,我有个主意-我会编辑它在:)
    猜你喜欢
    • 2012-04-30
    • 2013-05-29
    • 2012-07-25
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多