tom*_*erz 9 rerender backbone.js handlebars.js
我有一个视图,它持有车把模板.该模板由另一个部分模板组成.该部分模板包含结果列表,我在我的应用程序的不同部分使用.无论如何,当试图过滤结果时,我只想渲染那部分.意味着骨干视图不应该使整个视图只是局部的.能做到吗?
jev*_*lio 20
是的,这是可能的.最简单的方法是像渲染完整视图一样执行整个模板,但只替换视图中需要的部分el
.
就像是:
template: Handlebars.compile(templateHtml),
render: function() {
//let's say your render looks something like this
this.$el.html(this.template(this.model.toJSON());
},
renderList: function() {
var html = this.template(this.model.toJSON());
var selector = "#list";
//replace only the contents of the #list element
this.$el.find(selector).replaceWith($(selector, html));
}
Run Code Online (Sandbox Code Playgroud)
根据模板的动态程度,您可能必须this.delegateEvents()
在替换列表后调用视图的事件才能正常工作.
根据评论进行编辑:
为了澄清,我在这里建议的方法确实再次执行视图的主要把手模板,但它不再渲染整个视图.
一步步:
像在普通渲染中一样执行Handlebars模板功能.
var html = this.template(this.model.toJSON());
Run Code Online (Sandbox Code Playgroud)
该变量html
现在包含一个HTML标记字符串.什么都没有呈现.
为要重新渲染的元素定义选择器.
var selector = "#list";
Run Code Online (Sandbox Code Playgroud)找到要替换的DOM元素.这假设您已经渲染了一次视图.否则将不会有任何#list
元素this.$el
.
this.$el.find(selector)
Run Code Online (Sandbox Code Playgroud)在模板化的html字符串中找到相应的元素,并用新的元素替换现有的元素:
.replaceWith($(selector, html));
Run Code Online (Sandbox Code Playgroud)这只会替换#list
当前页面上的元素.外面的任何东西#list
都不会以任何方式重新呈现或触及.
我建议你这样做的主要原因,而不是分别执行和渲染部分模板,你的视图不需要知道模板和模板引擎的实现细节.所有它需要知道有一个元素#list
.我相信这是一个更清洁的解决方案,并使您的模板详细信息与您的视图逻辑分开.