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?
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:)
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 }} ...
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);
});
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}
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:
- 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 - bardzo lubię Szablony wąsów i nie chcę przerzucać całego projektu na coś innego z powodu tego małego problemu.
- 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.
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:
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
};
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