如何使用underscore.js作为模板引擎?

时间:2011-01-24 05:13:54

标签: javascript node.js functional-programming underscore.js template-engine

我正在尝试了解javascript作为服务器端语言和函数式语言的新用法。几天前我听说过node.js和表达框架。然后我看到underscore.js作为一组实用函数。我看到了this question on stackoverflow 。它说我们可以使用underscore.js作为模板引擎。任何人都知道有关如何使用underscore.js进行模板化的好教程,特别是对于那些对高级javascript经验较少的biginners。谢谢

8 个答案:

答案 0 :(得分:462)

您需要了解的关于下划线模板的所有内容都是here。只需记住三件事:

  1. <% %> - 执行一些代码
  2. <%= %> - 在模板中打印一些值
  3. <%- %> - 打印HTML转义的某些值
  4. 这就是它的全部。

    简单示例:

    var tpl = _.template("<h1>Some text: <%= foo %></h1>");
    

    然后tpl({foo: "blahblah"})将呈现给字符串<h1>Some text: blahblah</h1>

答案 1 :(得分:198)

<!-- 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>
  • JsFiddle谢谢@PHearst!
  • JsFiddle(最新)
  • JsFiddle按第一个字母分组的列表(具有图像,函数调用,子模板的复杂示例)分叉!爆炸......
  • JsFiddle下面的@tarun_telang注意到XSS黑客的演示
  • JsFiddle一种执行子模板的非标准方法

答案 2 :(得分:93)

用最简单的形式你可以使用它:

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>');

答案 3 :(得分:28)

模板的文档是部分的,我看了源。

_。template 函数有3个参数:

  1. 字符串文字:模板字符串
  2. 对象数据:评估数据
  3. 对象设置:本地设置, _。templateSettings 是全局设置对象
  4. 如果没有给出数据(或null),则返回渲染函数。它有一个参数:

    1. 对象数据:与上面的数据相同
    2. 设置中有3个正则表达式和1个静态参数:

      1. RegExp 评估:“&lt;%code%&gt;”在模板字符串
      2. RegExp 插值:“&lt;%= code%&gt;”在模板字符串
      3. RegExp 转义:“&lt;% - code%&gt;”
      4. 字符串变量:可选,模板字符串中数据参数的名称
      5. 将简单评估评估部分中的代码。您可以使用 __ p + =“mystring”命令将此部分中的字符串添加到已评估的模板中,但不建议这样做(不是模板界面的一部分),请使用插值部分而不是它。此类部分用于向模板添加if或for等块。

        插入部分中的代码结果将添加到已评估的模板中。如果返回null,则会添加空字符串。

        转义部分在给定代码的返回值上使用 _。escape 转义html。所以它类似于插入部分中的 _。escape(code),但它与 \ 一起逃脱了像 \这样的空白字符n 在将代码传递给 _。escape 之前。我不知道为什么这很重要,它在代码中,但它适用于插入 _。escape - 它不会逃避空白区域人物 - 也是。

        默认情况下,数据参数由和(数据){...} 语句传递,但这种评估比使用命名的评估要慢得多变量。因此,使用变量参数命名数据是件好事......

        例如:

        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()函数,或者您可以使用tpl plugin从单独的文件加载它require.js

        使用laconic而不是模板化构建dom树的另一个选项。

答案 4 :(得分:22)

我给出了一个非常简单的例子

1)

var data = {site:"mysite",name:"john",age:25};
var template = "Welcome you are at <%=site %>.This has been created by <%=name %> whose age is <%=age%>";
var parsedTemplate = _.template(template,data);
console.log(parsedTemplate); 

结果将是

Welcome you are at mysite.This has been created by john whose age is 25.

2)这是一个模板

   <script type="text/template" id="template_1">
       <% _.each(items,function(item,key,arr) { %>
          <li>
             <span><%= key %></span>
             <span><%= item.name %></span>
             <span><%= item.type %></span>
           </li>
       <% }); %>
   </script>

这是html

<div>
  <ul id="list_2"></ul>
</div>

这是包含json对象并将模板放入html

的javascript代码

   var items = [
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       } 
   ];
  $(document).ready(function(){
      var template = $("#template_1").html();
      $("#list_2").html(_.template(template,{items:items}));
  });

答案 5 :(得分:14)

表达它很容易。您需要的只是在节点上使用合并模块,因此您需要安装它:

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

我希望这能帮到你!

答案 6 :(得分:12)

我想分享一个更重要的发现。

使用&lt;%= variable =&gt;会导致跨站点脚本漏洞。因此使用它更安全&lt;% - variable - &gt;代替。

我们必须将&lt;%=替换为&lt;% - 以防止跨站点脚本攻击。不确定,这是否会对性能产生任何影响

答案 7 :(得分:1)

Lodash也一样 首先编写如下脚本:

<script type="text/template" id="genTable">
<table cellspacing='0' cellpadding='0' border='1'>
        <tr>
            <% for(var prop in users[0]){%>
            <th><%= prop %> </th>
            <% }%>
        </tr>
        <%_.forEach(users, function(user) { %>
            <tr>
                 <% for(var prop in user){%>
                    <td><%= user[prop] %> </td>
                <% }%>

            </tr>
        <%})%>
</table>

现在编写一些简单的JS如下:

var arrOfObjects = [];
for (var s = 0; s < 10; s++) {
    var simpleObject = {};
    simpleObject.Name = "Name_" + s;
    simpleObject.Address = "Address_" + s;
    arrOfObjects[s] = simpleObject;
}
var theObject = { 'users': arrOfObjects }
var compiled = _.template($("#genTable").text());
var sigma = compiled({ 'users': myArr });

$(sigma).appendTo("#popup");

popoup是你想要生成表格的div