Escape double braces { ... } in Mustache template. (Tworzenie szablonu w NodeJS)

Próbuję stworzyć szablon, jak poniżej:

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

{{{debug this}}}

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

Gdzie chcę potroić nawiasy, aby pozostać, ale podwójne nawiasy należy zastąpić JSON przekazanym. Zna ktoś najlepszy sposób na zrobienie tego bez pisania post-procesowego kodu JS, a jeśli nie, to czy jest dobry silnik szablonów nodeJS do tego typu scenariuszy?

Author: m59, 2012-12-19

6 answers

Możesz przełączyć ograniczniki na coś, co nie będzie sprzeczne z potrójnymi wąsami, jak znaczniki w stylu erb:

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

Zauważ, że możesz to robić tyle razy, ile chcesz w całym szablonie. Za każdym razem, gdy napotkasz coś, co jest sprzeczne, wybierz nowy zestaw ograniczników:)

 38
Author: bobthecow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 08:33:53

Jak opisano w to pytanie nie obsługuje zmiany ograniczników. Ale ty możesz uciec od podwójnych szelek z ukośnikiem takim jak ten:

HTML:

... \{{ myHandlbarsVar }} ...
 60
Author: tmuecksch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Możesz również przypisać Mustache.tags = ["[[", "]]"]; przed kompilacją szablonu.

Http://jsfiddle.net/fhwe4o8k/1/

Np.

    $(function () {
        Mustache.tags = ["[[", "]]"];
        var template = $('#test').html();
        Mustache.parse(template);
        var rendered = Mustache.render(template, {test: "Chris"});
        $('#content-placeholder').html(rendered);
    });
 9
Author: Christopher Marshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 20:54:59

Inną opcją jest utworzenie helpera do wyświetlania nawiasów klamrowych.

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

A następnie użyj go w szablonie tak:

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

Które następnie wyprowadza:

{Stack Over Flow Rocks}
 5
Author: Austin Haws,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-26 20:37:21

Chciałem tylko nieco innego podejścia. Próbowałem kilku innych sposobów i oto kilka rzeczy, które mi się w nich nie podobały:

  1. Zmiana domyślnego kąta {{obj.property}} nawiasów na coś innego jest złym pomysłem. Głównie dlatego, że jak tylko zaczniesz używać komponentów innych firm, które nie są świadome niestandardowej konfiguracji kątowej, wiązania w tych komponentach trzeciej części przestaną działać. Warto również wspomnieć, że zespół AngularJS nie chce jechać tą trasą aby zezwolić na wiele notacji wiążących, sprawdź ten problem
  2. bardzo lubię Szablony wąsów i nie chcę przerzucać całego projektu na coś innego z powodu tego małego problemu.
  3. sporo osób zaleca, aby nie mieszać renderowania po stronie klienta i serwera. Nie do końca się Zgadzam, uważam, że jeśli budujesz stronę wielostronicową, która ma kilka stron z kanciastymi i inne, które są statyczne (coś jak o nas lub strony z Warunkami), to jest w porządku aby korzystać z szablonów po stronie serwera, aby ułatwić utrzymanie tych stron. Ale to powiedziawszy, dla części, które są kątowe, nie powinieneś mieszać renderowania po stronie serwera.

Ok no my answer: Jeśli używasz NodeJS i Express powinieneś być następujący:

Zamień wiązania {{}} w części kątowej na coś w rodzaju {[{}]} (lub coś zupełnie unikalnego)

Teraz w Twojej trasie dodaj callback do metody renderowania:

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

To powinno pozwolić na używanie wąsów razem z AngularJS. Jednym z ulepszeń, które możesz zrobić, jest wyodrębnienie tej metody do osobnego modułu, aby ponownie użyć we wszystkich trasach.

 0
Author: Vitalij,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-17 10:17:40

Jest to dobre rozwiązanie, które znalazłem dla tego typu problemu, gdzie można łatwo przełączać ograniczniki w ustawieniach szablonu w trybie runtime:

Http://olado.github.com/doT/

Możesz wykonać ustawienia RegEx w następujący sposób:

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
};
 -3
Author: Nick Jonas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 20:33:21