2012-12-19 8 views
23

Próbuję szablon szablon, jak poniżej:Ukryj podwójny nawias klamrowy {{...}} w szablonie wąsów. (Templating szablonu w NodeJS)

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

{{{debug this}}} 

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

Gdzie ja chce potroić wsporniki się zatrzymać, ale podwójna nawiasy zastępowane przez JSON przekazane. Ktoś wie najlepiej, jak to zrobić bez pisania kodu JS post-process, a jeśli nie, czy istnieje dobry silnik szablonu nodeJS dla tego typu scenariusza?

+0

Czy istnieje dobry powód to robisz? Wydaje się nieco skomplikowane! Może możesz to osiągnąć w inny sposób? –

+0

Tworzę generator kompilacji/rusztowania CLI dla struktury javascript, więc chciałbym aby szablony były częścią tego ... –

+1

Czy spojrzałeś na [grunt init] (https://github.com/gruntjs/grunt-init) system szablonów, który pomaga w tworzeniu szablonów takich jak ten? . [Yeoman] (http://yeoman.io) również robi coś podobnego. Mam nadzieję, że trochę wysiłku z budowania takiego generatora zajmie. Jeśli chodzi o kierownicę, to nie wygląda na to, że istnieje sposób na zmianę ograniczników, ale istnieje opcja ucieczki wbudowana zgodnie z tym problemem https://github.com/wycats/handlebars.js/issues/146. Wiele innych systemów (wąsy, podkreślenia itp.) Umożliwia zmianę delimetrów. –

Odpowiedz

34

Można przełączać się ograniczniki do czegoś, co nie będzie w sprzeczności z potrójnymi wąsów, podobnie jak znaczniki erb-style:

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

pamiętać, że można to zrobić tyle razy, ile chcesz w całym szablonie. Za każdym razem kiedy napotkasz coś, co wywołuje konflikt, wybrać nowy zestaw ograniczników :)

+1

Nie znalazłem sposobu, aby to zrobić za pomocą kierownicy ... –

+7

W kierownicy uciekasz szelki z ukośnikiem odwrotnym. –

+3

Czekaj. Zastanawiasz się nad kierownicą? Oznaczyłeś to jako Moustache i Mustache.js, a nawet nie wspomniałeś o Handlebars :) – bobthecow

-3

Jest to dobre rozwiązanie znalazłem dla tego typu problemu, gdzie można łatwo przełączać ograniczniki w ustawieniach szablonu w czasie wykonywania:

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

można zrobić ustawienia regex tak:

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 
}; 
+0

Lodash pozwoli także na przełączanie ograniczników: http://lodash.com/docs#template –

+1

Musisz żartować. Przyjmujesz własną odpowiedź, która nie odpowiada na twoje własne pytanie, które jest doskonale adresowane przez @bobthecow? –

53

jak opisano w this Question kierownicy nie obsługuje zmieniając ograniczniki. Ale może uciec podwójne szelki z backslashem tak:

HTML:

... \{{ myHandlbarsVar }} ... 
+6

To nie działa w wąsach. . . a to pytanie dotyczy właśnie wąsów. Najwyraźniej ludzie uznali tę odpowiedź za przydatną, więc nie odebrali ode mnie, ale chcieli skomentować każdego, kto to znalazł i pomyślał, że może rozwiązać wszystkie swoje problemy. – tandrewnichols

+1

pracował dla mnie w kierownicy, mogę nawet robić rzeczy takie jak: \ {{unrendered {{data}}}} ' – Erandros

8

Można również przypisać Mustache.tags = ["[[", "]]"]; przed szablonie kompilacji.

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

super, dziękuję – daremachine

0

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

  1. Zmiana kątowej Wartość domyślna {{obj.property}} wsporniki do czegoś innego jest to zły pomysł. Głównie dlatego, że po rozpoczęciu korzystania z komponentów innych firm, które nie są świadome niestandardowej konfiguracji kątowej, wiązania w tych składnikach trzeciej części przestaną działać. Warto również wspomnieć, że zespół AngularJS wydaje się nie chcieć iść na drogę zezwalania na wielokrotne notowania wiązania, sprawdzanie this issue
  2. Bardzo lubię szablony wąsów i nie chcę przełączać całego projektu na coś innego z powodu tego małego problemu .
  3. Dość kilka osób zaleca, aby nie mieszać renderowania po stronie klienta i serwera. Nie w pełni się zgadzam, wierzę, że jeśli budujesz wielostronicową stronę internetową, która ma kilka stron z kanciastą, a także kilka innych, które są statyczne (coś podobnego do nas lub stron z warunkami), to doskonale jest używać szablonów po stronie serwera, aby tworzyć utrzymanie tych stron jest łatwiejsze.Ale to powiedziawszy, dla części, które są Angular, nie powinieneś mieszać renderowania po stronie serwera.

Ok nie moja odpowiedź: Jeśli używasz NodeJS i ekspresowe powinny być następujące:

Wymień Wiązania {{}} w kątowym części z czymś {[{}]} (lub coś zupełnie unikalnego)

teraz w was trasie dodać oddzwanianie do renderowania metoda:

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życie Wąsy togethe r z AngularJS. Jednym z ulepszeń, które możesz zrobić, jest wyodrębnienie tej metody do osobnego modułu, aby ponownie wykorzystać wszystkie trasy.

5

Inną opcją jest utworzenie pomocnika do wyprowadzania nawiasów klamrowych.

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

a następnie używać go w szablonie tak:

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

który następnie wyjść:

{Stack Over Flow Rocks}