我正在使用 Backbone 结合 CoffeeScript 和 Handlebars 创建一个搜索结果页面。我有两个 View :一个用于结果列表 (ListView),第二个 View 用于单个结果 (ResultView)。简化代码:
ListView = Backbone.View.extend
el: $("ul#results")
...
addItem: (result) ->
resultView = new ResultView({
model: result
})
resultView.parentView = this
this.el.append(resultView.render().el)
ResultView = Backbone.View.extend
tagName: "li"
className: "result"
events:
...
简短说明:
ul#results
li.result
(默认主干行为) 这是(简化)我用来呈现搜索结果的模板:
<li class="result">
<h1>
<a href="{{link}}">{{title}}</a>
</h1>
<p>{{snippet}}</p>
</li>
这是我的难题,正如您自己发现的那样:我在我的 Backbone ResultView 和我的模板中定义了一个
li.result
。我不能做什么:li.result
因为它在 DOM 中尚不存在 li.result
,因为我仍然需要它来为那些没有启用 JavaScript 的人呈现页面服务器端 有没有办法(优雅地)在实例化后将 Backbone View 重新分配给元素?或者简单地说,我可以将 ResultView 引用到一个临时元素,渲染模板,然后将其移动到
ul#result
中吗?还是我看错了?谢谢!
最佳答案
我建议简单地从您的 View 中触发渲染事件,然后在 onRendered 回调中执行您的操作,如下所示:
initialize: function() {
this.bind('rendered', onRendered);
},
onRendered: function() {
// do onRendered stuff
// eg. remove an element from the template
},
render: function() {
// your render stuff
this.trigger('rendered');
}