Подтвердить что ты не робот

Выбери двойные фигурные скобки {{...}} в шаблоне Mustache. (шаблон шаблона в NodeJS)

Я пытаюсь создать шаблон шаблона, как показано ниже:

{{{
{
  "name" : "{{name}}",
  "description" : "{{description}}"
}
}}}

{{{debug this}}}

<h1>{{name}}</h1>

Где я хочу, чтобы тройные скобки оставались, но двойные скобки, которые нужно заменить на JSON, прошли. Кто-нибудь знает лучший способ сделать это без написания JS-кода после процесса, а если нет, есть ли хороший шаблон nodeJS двигатель для этого типа сценария?

4b9b3361

Ответ 1

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

{{=<% %>=}}
{{{
{
  "name": "<% name %>",
  "description": "<% description %>"
}
}}}
{{{debug this}}}
<%={{ }}=%>

Обратите внимание, что вы можете делать это столько раз, сколько хотите в шаблоне. Каждый раз, когда вы сталкиваетесь с конфликтом, выбирайте новый набор разделителей:)

Ответ 2

Как описано в этом вопросе, handlebars не поддерживает изменение разделителей. Но вы можете сбрасывать двойные фигурные скобки с помощью обратного слэша следующим образом:

HTML:

... \{{ myHandlbarsVar }} ...

Ответ 3

Вы также можете назначить Mustache.tags = ["[[", "]]"]; перед компиляцией шаблона.

http://jsfiddle.net/fhwe4o8k/1/

например.

    $(function () {
        Mustache.tags = ["[[", "]]"];
        var template = $('#test').html();
        Mustache.parse(template);
        var rendered = Mustache.render(template, {test: "Chris"});
        $('#content-placeholder').html(rendered);
    });

Ответ 4

другой вариант создает помощник для вывода фигурных скобок.

Handlebars.registerHelper('curly', function(object, open) {
    return open ? '{' : '}';
});

а затем используйте его в шаблоне следующим образом:

<script id="template" type="text/x-handlebars-template">
    {{curly true}}{{name}}{{curly}}
</script>

который затем выводит:

{Stack Over Flow Rocks}

Ответ 5

Я просто хотел немного другого подхода. Я пробовал несколько других способов, и вот несколько вещей, которые мне не нравились в них:

  • Изменение Angular стандартных {{obj.property}} скобок на что-то другое - плохая идея. В основном beacause, как только вы начнете использовать сторонние компоненты, которые не знают о вашей нестандартной конфигурации Angular, привязки в этих компонентах третьей части перестанут работать. Также стоит упомянуть, что команда AngularJS, похоже, не хочет идти по пути предоставления нескольких привязок, отметьте эту проблему
  • Мне очень нравятся шаблоны Mustache и не хочу переключать весь проект на что-то еще из-за этой небольшой проблемы.
  • Довольно много людей рекомендуют не смешивать рендеринг на стороне клиента и сервера. Я не совсем согласен, я полагаю, что если вы создаете многостраничный веб-сайт с несколькими страницами с Angular и некоторыми другими, которые являются статическими (что-то вроде нас или страниц Условий и Условий), совершенно нормально использовать шаблоны на стороне сервера чтобы упростить обслуживание этих страниц. Но это говорит о том, что для частей, которые являются Angular, вы не должны смешивать визуализацию на стороне сервера.

Хорошо, нет моего ответа: Если вы используете NodeJS и Express, вы должны быть следующими:

Замените привязки {{}} в вашей части Angular чем-то вроде {[{}]} (или что-то совершенно уникальное)

Теперь в вашем маршруте добавьте обратный вызов к методу рендеринга:

app.get('/', function(req, res){
  res.render('home', {
    title: 'Awesome Website',
    description: 'Uber Awesome Website'
  }, function(err, html){
    var htmlWithReplacedLeftBracket = html.replace(/{\[{/g, '{{');
    var finalHtml = htmlWithReplacedLeftBracket.replace(/}\]}/g, '}}');
    res.send(finalHtml);
  });
});

Это должно позволить вам использовать Усы вместе с AngularJS. Одно из улучшений, которое вы могли бы сделать, - это извлечь этот метод в отдельный модуль для повторного использования во всех маршрутах.

Ответ 6

Это хорошее решение, которое я нашел для этого типа проблем, где вы можете легко переключать разделители в настройках шаблона во время выполнения:

http://olado.github.com/doT/

Вы можете выполнить настройки RegEx следующим образом:

doT.templateSettings = {
  evaluate:    /\{\{([\s\S]+?)\}\}/g,
  interpolate: /\{\{=([\s\S]+?)\}\}/g,
  encode:      /\{\{!([\s\S]+?)\}\}/g,
  use:         /\{\{#([\s\S]+?)\}\}/g,
  define:      /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,
  conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g,
  iterate:     /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,
  varname: 'it',
  strip: true,
  append: true,
  selfcontained: false
};