0

什么方法会更有效?

我有一个 Backbone.Collection,所以我创建了一个 Backbone.View 来呈现这个集合。CollectionView 渲染方法:

render: ->
    container = document.createDocumentFragment()
    @collection.each (item) ->
        view = new ItemView(item)
        container.appendChild view.el
        view.render()
    $(el).append container

我可以以两种形式使用这些事件。

1.- 在 CollectionView 中设置事件对象,所以我需要在 CollectionView 中声明选择项目的动作并“拯救”我选择的模型。

CollectionView extends Backbone.View
    events:
        'click #itemView', 'onSelectItem'
    onSelectItem: ->
        ##Get the model
        ##Show ItemDetailView

2.- 为每个 itemView 设置事件对象,因此 select 方法不需要检索模型。

ItemView extends Backbone.View
    events:
        'click #div','onSelect'
    onSelect: ->
        #Show ItemDetailView

这些选项中哪个更好?

已编辑:我创建了一个 JSperf 片段http://jsperf.com/backbone-events-on-collectionview-or-per-itemview

JSperf 向我们展示了 ItemView 方法更快,但这是唯一衡量重要性的指标吗?

4

2 回答 2

0

如果我理解正确,选项 2 似乎是最理智的。您将指代而this.model不是挖掘集合以查找与单击的视图关联的模型。

于 2013-09-13T12:42:16.177 回答
0

第二种方法要好得多。抛开性能不谈,代码要简单得多。6个月后,如果你不得不回到这段代码,你认为事件会在ItemView中处理,还是在CollectionView中处理?它是 ItemView 上的一个点击事件,所以我会去那里寻找它是如何处理的。

是否有充分的理由处理集合中的事件?如果您需要处理来自 CollectionView 的事件,您可以将事件委托给集合。有点重定向,但是,对我来说,这要清楚得多。例如:

# The collection view

initialize: ->
  @listenTo @, 'selected', @itemSelected

render: ->
  container = document.createDocumentFragment()
  @collection.each (item) ->
    view = new ItemView(item, parent: @)
    container.appendChild view.el
    view.render()
  $(el).append container

itemSelected: (model)->
  # Do whatever you need to here, like 
  # show the ItemDetailView in the container

# The ItemView

ItemView extends Backbone.View
  events:
    'click #div','onSelect'
  onSelect: ->
    @options.parent.trigger('selected', @model, @)
    #Show ItemDetailView
于 2013-09-15T00:44:38.247 回答