Как использовать underscore.js в качестве движка шаблонов? - PullRequest
257 голосов
/ 24 января 2011

Я пытаюсь узнать о новых применениях javascript как серверного языка и как функционального языка.Несколько дней назад я слышал о node.js и Express Framework.Затем я увидел, что underscore.js - это набор служебных функций.Я видел этот вопрос по stackoverflow .Там написано, что мы можем использовать underscore.js в качестве движка шаблонов.Кто-нибудь знает хорошие учебники о том, как использовать underscore.js для шаблонов, особенно для начинающих, у которых меньше опыта работы с продвинутым JavaScript.Спасибо

Ответы [ 8 ]

464 голосов
/ 30 августа 2011

Все, что вам нужно знать о шаблоне подчеркивания, это здесь . Имейте в виду только 3 вещи:

  1. <% %> - выполнить некоторый код
  2. <%= %> - напечатать некоторое значение в шаблоне
  3. <%- %> - для вывода некоторых значений HTML экранированный

Вот и все.

Простой пример:

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

тогда tpl({foo: "blahblah"}) будет преобразовано в строку <h1>Some text: blahblah</h1>

198 голосов
/ 01 мая 2012
<!-- 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 Демонстрация взлома XSS, замеченного @tarun_telang ниже
  • JsFiddle Один нестандартный метод для создания под-шаблонов
93 голосов
/ 31 августа 2011

В простейшей форме вы бы использовали его как:

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

Я лично предпочитаю синтаксис стиля Усов. Вы можете настроить маркеры маркеров шаблона для использования двойных фигурных скобок:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

var template = _.template('<li>{{ name }}</li>');
28 голосов
/ 12 октября 2012

Документация для шаблонов является частичной, я наблюдал за источником.

Функция _. Template имеет 3 аргумента:

  1. String text: строка шаблона
  2. Объект Данные : данные оценки
  3. Объект Настройки : локальные настройки, _. TemplateSettings - это объект глобальных настроек

Если data (или null) не задано, будет возвращена функция render .Он имеет 1 аргумент:

  1. Объект Данные : аналогично Данные выше

Существует 3 шаблона регулярных выражений и 1статический параметр в настройках:

  1. RegExp оценка : "<% code%>" в строке шаблона
  2. RegExp интерполировать : "<% = code%> "в строке шаблона
  3. RegExp escape :" <% - code%> "
  4. String переменная : необязательно,имя параметра data в шаблонной строке

Код в секции оценивать будет просто оценен.Вы можете добавить строку из этого раздела с помощью команды __ p + = "mystring" к оцененному шаблону, но это не рекомендуется (не является частью интерфейса шаблонов), вместо этого используйте раздел интерполяции.Этот тип раздела предназначен для добавления блоков, таких как if или for, в шаблон.

Результат кода в разделе interpolate будет добавлен в оцененный шаблон.Если возвращено нулевое значение, будет добавлена ​​пустая строка.

Раздел escape экранирует html с _. Escape в возвращаемом значении данного кода.Таким образом, он похож на _. Escape (код) в интерполированном разделе, но экранируется с \ пробельными символами, такими как \ n перед передачей кода на _. escape .Я не знаю, почему это так важно, это в коде, но он хорошо работает с интерполировать и _. Escape - который не экранирует символы пробела -тоже.

По умолчанию параметр data передается оператором with (data) {...} , но этот вид оценки выполняется намного медленнее, чемоценивая с именованной переменной.Таким образом, присвоение имени data с помощью переменной является чем-то хорошим ...

Например:

<code>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 %>\"
", {text:" некоторый текст и \ n это разрыв строки "}, {variable:" o "}); $ (" body "). html (html);

results

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 из require.js .

Другой вариант построения дерева dom с laconic вместо шаблонов.

22 голосов
/ 19 февраля 2014

Я приведу очень простой пример

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>

Это код JavaScript, который содержит объект json и помещает шаблон в HTML

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

14 голосов
/ 17 марта 2013

с экспрессом это так просто.все, что вам нужно, это использовать модуль консолидировать на узле, поэтому вам нужно установить его:

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

Надеюсь, это помогло вам!

12 голосов
/ 22 ноября 2013

Я хотел бы поделиться еще одним важным выводом.

Использование <% = variable => приведет к уязвимости межсайтового скриптинга.Поэтому безопаснее использовать <% - variable ->.

Нам пришлось заменить <% = на <% - для предотвращения атак с использованием межсайтовых скриптов.Не уверен, повлияет ли это на производительность </p>

1 голос
/ 04 апреля 2016

Лодаш тоже самое Сначала напишите сценарий следующим образом:

<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, где вы хотите создать таблицу

...