template
_.template(templateString, [settings])
将 JavaScript 模板编译为可以用于页面呈现的函数, 对于通过 JSON 数据源生成复杂的 HTML 并呈现出来的操作非常有用。 模板函数可以使用<%= … %>
插入变量, 也可以用<% … %>
执行任意的 JavaScript 代码。 如果您希望插入一个值, 并让其进行 HTML 转义,请使用<%- … %>
。 当你要给模板函数赋值的时候,可以传递一个含有与模板对应属性的 data 对象 。 如果您要写一个一次性的, 您可以传对象 data作为第二个参数给模板 template 来直接呈现, 这样页面会立即呈现而不是返回一个模板函数. 参数 settings 是一个哈希表包含任何可以覆盖的设置 _.templateSettings
.
var compiled = _.template("hello: <%= name %>");
compiled({name: 'moe'});
=> "hello: moe"
var template = _.template("<b><%- value %></b>");
template({value: '<script>'});
=> "<b>&lt;script&gt;</b>
您也可以在 JavaScript 代码中使用 print
. 有时候这会比使用 <%= ... %>
更方便.
var compiled = _.template("<% print('Hello ' + epithet); %>");
compiled({epithet: "stooge"});
=> "Hello stooge
如果 ERB 式的分隔符您不喜欢, 您可以改变 Underscore 的模板设置, 使用别的符号来嵌入代码.定义一个 interpolate 正则表达式来逐字匹配嵌入代码的语句, 如果想插入转义后的 HTML 代码则需要定义一个 escape 正则表达式来匹配,还有一个 evaluate 正则表达式来匹配您想要直接一次性执行程序而不需要任何返回值的语句.您可以定义或省略这三个的任意一个.例如, 要执行 Mustache.js 类型的模板:
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g
};
var template = _.template("Hello {{ name }}!");
template({name: "Mustache"});
=> "Hello Mustache!
默认的, template 通过 with
语句来取得 data 所有的值. 当然, 您也可以在 variable 设置里指定一个变量名. 这样能显著提升模板的渲染速度.
_.template("Using 'with': <%= data.answer %>", {variable: 'data'})({answer: 'no'});
=> "Using 'with': no
预编译模板对调试不可重现的错误很有帮助. 这是因为预编译的模板可以提供错误的代码行号和堆栈跟踪, 有些模板在客户端(浏览器)上是不能通过编译的 在编译好的模板函数上, 有 source属性可以提供简单的预编译功能.
<script>
JST.project = <%= _.template(jstText).source %>;
</script>