在本例中,我们将模板内容放到一个<script>标签中,你可能已经注意到标签的type是text/template而不是text/javascript,因为它无法作为JavaScript脚本直接运行。
我也建议你将模板内容放在<script>中,因为如果你将它们写在一个<div>或其它标签中,它们可能会被添加到DOM树中进行解析(即使你隐藏了这个标签也无法避免)。
_.template模板函数只能解析3种模板标签(这比Smarty、JSTL要简单得多):
<% %>:用于包含JavaScript代码,这些代码将在渲染数据时被执行。
<%= %>:用于输出数据,可以是一个变量、某个对象的属性、或函数调用(将输出函数的返回值)。
<%- %>:用于输出数据,同时会将数据中包含的HTML字符转换为实体形式(例如它会将双引号转换为"形式),用于避免XSS攻击。
当我们希望将数据中的HTML作为文本显示出来时,常常会使用<%- %>标签。
Underscore还允许你修改这3种标签的形式,如果我们想使用{% %}、{%= %}、{%- %}作为标签,可以通过修改templateSettings来实现,就像这样:
_.templateSettings = { evaluate : /\{%([\s\S]+?)\%\}/g, interpolate : /\{%=([\s\S]+?)\%\}/g, escape : /\{%-([\s\S]+?)%\}/g }
在本例中,我们将模板内容和需要填充的数据传递给template方法,它会按以下顺序进行处理:
(1)将模板内容解析为可执行的JavaScript(解析模板标签)
(2)通过with语句将解析后的JavaScript作用域修改为我们传递的数据对象,这使我们能够直接在模板中通过变量形式访问数据对象的属性
(3)执行解析后的JavaScript(将数据填充到模板)
(4)返回执行后的结果
我们经常会遇到一种情况:多次调用template方法将数据渲染到同一个模板。
假设我们有一个分页列表,列表中的每一条数据都通过模板渲染,当用户进入下一页,我们会获取下一页的数据并重新渲染,实际上每次渲染的模板都是同一个,但刚才描述的template所有处理过程总会被执行。
其实Underscore的template方法提供了一种更高效的调用方式,我们将上面代码中的最后两句修改为:
// 解析模板, 返回解析后的内容 var render = _.template(tpl); var html = render(data); // 将解析后的内容填充到渲染元素 element.html(html);
你会发现细微的差别:我们在调用template方法时只传递了模板内容,而没有传递数据,此时template方法会解析模板内容,生成解析后的可执行JavaScript代码,并返回一个函数,而函数体就是解析后的JavaScript,因此当我们调用该函数渲染数据时,就省去了模板解析的动作。
你应该将返回的函数存储起来(就像我将它存储在render变量中一样),再通过调用该函数来渲染数据,特别是在同一个模板可能会被多次渲染的情况下,这样做能提高执行效率(具体提升多少,应该根据你的模板长度和复杂度而定,但无论如何,这都是一个良好的习惯)。
您可能感兴趣的文章: