1

可以像这样将@template() 分配给@el:

someview.js.coffee

class SomeView extends Backbone.View
  template: JST["app/templates/sometemplate"]

  events:
    'click' : 'onClick'

  initialize: ->

  render: ->
    @el = @template()

  onClick: ->
    #do something

index.js.coffee

class IndexView extends Backbone.View
  initialize: ->
    @collection.on('reset', @render, this)

  render: ->
    $(@el).html('')
    for m in @collection.models
      view = new App.Views.SomeView(model: m)
      $(@el).append(view.render().el)

sometemplate.jst.hamlc

.someview_template
  .stuff_inside

我所处的情况是 SomeView 类被一个 div 包裹,这让我失去了我想直接在“.someview_template”元素上分配的点击事件。我想解决这个问题的方法是重置 @el = @template()... 这可能还是正确的方法?

Backbone.View 的@el 是否应该始终是包含的 div,而模板应该只是该 div 中包含的元素?如果@el 自动设置为@template() 中的根节点,似乎会更基本。我是否应该让 sometemplate.jst.hamlc 只包含“.stuff_inside”,然后在 SomeView 中设置 $(@el).addClass('someview_template'),这样我就可以确定将事件分配给该元素?

谢谢!

4

1 回答 1

5

不,这不行,有几个原因:

  1. 您将失去事件绑定,@el因此您的任何事件都不会起作用。
  2. 缓存的@$el将不再匹配@el

如果要替换@el,请使用@setElement

设置元素 view.setElement(element)

如果您想将 Backbone 视图应用到不同的 DOM 元素,请使用setElement,它还将创建缓存$el引用并将视图的委托事件从旧元素移动到新元素。

你可能想要更像这样的东西:

render: ->
  @setElement(@template())
  @
于 2012-07-27T19:16:09.433 回答