我正在学习javascript作为服务器端语言和函数式语言的新用法。前几天我听说了node.js和express framework。然后我看到了underscore.js作为一组实用函数。我在stackoverflow上看到了这个问题 . 它说我们可以使用underscore.js作为模板引擎。有人知道关于如何使用underscore.js来做模板的教程吗,特别是对于那些对高级javascript缺乏经验的大程序员。谢谢
当前回答
该文档用于模板的部分,我看了源代码。
_。模板函数有3个参数:
String text:模板字符串 对象数据:评价数据 对象设置:本地设置,_。templateSettings是全局设置对象
如果没有给定数据(或null),则返回一个渲染函数。它有1个参数:
对象数据:同上
在设置中有3个正则表达式模式和1个静态参数:
RegExp: "<%code%>"在模板字符串中 RegExp插值:"<%=code%>"在模板字符串中 RegExp转义:"<%-code%>" 字符串变量:可选,模板字符串中数据参数的名称
求值节中的代码将被简单地求值。你可以使用__p+="mystring"命令将此部分的字符串添加到被评估的模板中,但不建议这样做(不是模板接口的一部分),使用interpolate部分代替。这种类型的section用于向模板中添加if或for之类的块。
插值段中代码的结果将被添加到已计算的模板中。如果返回null,则添加空字符串。
转义节在给定代码的返回值上使用_.escape转义html。因此,它类似于插值节中的_.escape(代码),但它在将代码传递给_.escape之前使用像\n这样的空白字符进行转义。我不知道为什么这很重要,它在代码中,但它与interpolate和_.escape(它也不转义空白字符)一起工作得很好。
默认情况下,data参数由with(data){…}语句,但是这种求值比用命名变量求值要慢得多。所以用变量参数命名数据是件好事……
例如:
var html = _.template(
"<pre>The \"<% __p+=_.escape(o.text) %>\" is the same<br />" +
"as the \"<%= _.escape(o.text) %>\" and the same<br />" +
"as the \"<%- o.text %>\"</pre>",
{
text: "<b>some text</b> and \n it's a line break"
},
{
variable: "o"
}
);
$("body").html(html);
结果
The "<b>some text</b> and
it's a line break" is the same
as the "<b>some text</b> and
it's a line break" and the same
as the "<b>some text</b> and
it's a line break"
你可以在这里找到更多的例子,如何使用模板和覆盖默认设置: http://underscorejs.org/#template
通过模板加载,你有很多选择,但最后你总是要把模板转换成字符串。你可以像上面的例子一样给它一个普通的字符串,或者你可以从一个脚本标签加载它,并使用jquery的.html()函数,或者你可以用require.js的tpl插件从一个单独的文件加载它。
另一种选择是使用简洁而不是模板来构建dom树。
其他回答
<!-- Install jQuery and underscore -->
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<!-- Create your template -->
<script type="foo/bar" id='usageList'>
<table cellspacing='0' cellpadding='0' border='1' >
<thead>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<%
// repeat items
_.each(items,function(item,key,list){
// create variables
var f = item.name.split("").shift().toLowerCase();
%>
<tr>
<!-- use variables -->
<td><%= key %></td>
<td class="<%= f %>">
<!-- use %- to inject un-sanitized user input (see 'Demo of XSS hack') -->
<h3><%- item.name %></h3>
<p><%- item.interests %></p>
</td>
</tr>
<%
});
%>
</tbody>
</table>
</script>
<!-- Create your target -->
<div id="target"></div>
<!-- Write some code to fetch the data and apply template -->
<script type="text/javascript">
var items = [
{name:"Alexander", interests:"creating large empires"},
{name:"Edward", interests:"ha.ckers.org <\nBGSOUND SRC=\"javascript:alert('XSS');\">"},
{name:"..."},
{name:"Yolando", interests:"working out"},
{name:"Zachary", interests:"picking flowers for Angela"}
];
var template = $("#usageList").html();
$("#target").html(_.template(template,{items:items}));
</script>
谢谢@ phhearst ! JsFiddle(最新) JsFiddle列表分组的第一个字母(复杂的例子w/图像,函数调用,子模板)分叉!玩得开心点…… @tarun_telang注意到XSS黑客的JsFiddle演示 一种做子模板的非标准方法
该文档用于模板的部分,我看了源代码。
_。模板函数有3个参数:
String text:模板字符串 对象数据:评价数据 对象设置:本地设置,_。templateSettings是全局设置对象
如果没有给定数据(或null),则返回一个渲染函数。它有1个参数:
对象数据:同上
在设置中有3个正则表达式模式和1个静态参数:
RegExp: "<%code%>"在模板字符串中 RegExp插值:"<%=code%>"在模板字符串中 RegExp转义:"<%-code%>" 字符串变量:可选,模板字符串中数据参数的名称
求值节中的代码将被简单地求值。你可以使用__p+="mystring"命令将此部分的字符串添加到被评估的模板中,但不建议这样做(不是模板接口的一部分),使用interpolate部分代替。这种类型的section用于向模板中添加if或for之类的块。
插值段中代码的结果将被添加到已计算的模板中。如果返回null,则添加空字符串。
转义节在给定代码的返回值上使用_.escape转义html。因此,它类似于插值节中的_.escape(代码),但它在将代码传递给_.escape之前使用像\n这样的空白字符进行转义。我不知道为什么这很重要,它在代码中,但它与interpolate和_.escape(它也不转义空白字符)一起工作得很好。
默认情况下,data参数由with(data){…}语句,但是这种求值比用命名变量求值要慢得多。所以用变量参数命名数据是件好事……
例如:
var html = _.template(
"<pre>The \"<% __p+=_.escape(o.text) %>\" is the same<br />" +
"as the \"<%= _.escape(o.text) %>\" and the same<br />" +
"as the \"<%- o.text %>\"</pre>",
{
text: "<b>some text</b> and \n it's a line break"
},
{
variable: "o"
}
);
$("body").html(html);
结果
The "<b>some text</b> and
it's a line break" is the same
as the "<b>some text</b> and
it's a line break" and the same
as the "<b>some text</b> and
it's a line break"
你可以在这里找到更多的例子,如何使用模板和覆盖默认设置: http://underscorejs.org/#template
通过模板加载,你有很多选择,但最后你总是要把模板转换成字符串。你可以像上面的例子一样给它一个普通的字符串,或者你可以从一个脚本标签加载它,并使用jquery的.html()函数,或者你可以用require.js的tpl插件从一个单独的文件加载它。
另一种选择是使用简洁而不是模板来构建dom树。
最简单的形式是这样的:
var html = _.template('<li><%= name %></li>', { name: 'John Smith' });
//html is now '<li>John Smith</li>'
如果你要多次使用一个模板,你会想要编译它,这样它会更快:
var template = _.template('<li><%= name %></li>');
var html = [];
for (var key in names) {
html += template({ name: names[i] });
}
console.log(html.join('')); //Outputs a string of <li> items
我个人更喜欢Mustache风格的语法。您可以调整模板标记标记使用双花括号:
_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;
var template = _.template('<li>{{ name }}</li>');
用快递就很简单了。你所需要的是在节点上使用巩固模块,所以你需要安装它:
npm install consolidate --save
然后你应该改变默认引擎的HTML模板:
app.set('view engine', 'html');
为HTML扩展注册下划线模板引擎:
app.engine('html', require('consolidate').underscore);
搞定了!
现在加载一个名为'index.html'的模板:
res.render('index', { title : 'my first page'});
可能需要安装下划线模块。
npm install underscore --save
我希望这对你有所帮助!
你需要知道的关于下划线模板的一切都在这里。只需要记住3件事:
<% %> -执行一些代码 <%= %> -打印模板中的某些值 <%- %> -打印HTML转义的一些值
就是这样。
简单的例子:
var tpl = _.template("<h1>Some text: <%= foo %></h1>");
那么tpl({foo: "blahblah"})将被渲染为字符串<h1>一些文本:blahblah</h1>
推荐文章
- 如何使用Jest测试对象键和值是否相等?
- 将长模板文字行换行为多行,而无需在字符串中创建新行
- 如何在JavaScript中映射/减少/过滤一个集?
- Bower: ENOGIT Git未安装或不在PATH中
- 为什么在节点REPL中没有定义__dirname ?
- 添加javascript选项选择
- 在Node.js中克隆对象
- 为什么在JavaScript的Date构造函数中month参数的范围从0到11 ?
- 使用JavaScript更改URL参数并指定默认值
- 在window.setTimeout()发生之前取消/终止
- 如何删除未定义和空值从一个对象使用lodash?
- Node.js中的process.env.PORT是什么?
- js的Mongoose.js字符串到ObjectId函数
- 检测当用户滚动到底部的div与jQuery
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?