可以将@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'元素上分配的click事件。我可以想到解决这个问题的方法是重新设置@el = @template()...是可行的还是正确的方法?
Backbone.View的@el应该始终是包含div的情况,模板应该只是该div中包含的元素吗?如果将@el自动设置为@template()中找到的根节点,似乎会更基本。我应该让sometemplate.jst.hamlc只包含“.stuff_inside”,然后在SomeView中设置$(@ el).addClass('someview_template'),这样我可以确定事件是否已分配给该元素?
谢谢!
答案 0 :(得分:5)
不,由于几个原因,这是不行的:
@el
上的事件绑定,因此您的活动都不起作用。@$el
将不再与@el
匹配。如果您要替换@el
,请使用@setElement
:
setElement
view.setElement(element)
如果您想将Backbone视图应用于其他DOM元素,请使用 setElement ,这也将创建缓存的
$el
引用并从旧视图移动视图的委派事件元素到新的。
你可能想要更像这样的东西:
render: ->
@setElement(@template())
@