Escapar llaves dobles {}} en la plantilla Bigote. (crear una plantilla en NodeJS)


Estoy tratando de crear una plantilla, como la siguiente:

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

{{{debug this}}}

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

Donde quiero que los corchetes triples permanezcan, pero que los corchetes dobles se reemplacen con el JSON pasado. Alguien sabe la mejor manera de hacer esto sin escribir código JS post-proceso, y si no, ¿hay un buen motor de plantilla NodeJS para este tipo de escenario?

Author: m59, 2012-12-19

6 answers

Puede cambiar los delimitadores a algo que no entre en conflicto con los bigotes triples, como las etiquetas de estilo erb:

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

Tenga en cuenta que puede hacer esto tantas veces como desee a lo largo de su plantilla. Cada vez que se encuentre con algo que entre en conflicto, elija un nuevo conjunto de delimitadores:)

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-19 08:33:53

Como se describe en esta Pregunta manillar no admite cambiar los delimitadores. Pero tú puedes escapar de las llaves dobles con una barra invertida como esta:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

También puede asignar Mustache.tags = ["[[", "]]"]; antes de la compilación de la plantilla.

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

Por ejemplo

    $(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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-10 20:54:59

Otra opción es crear un ayudante para la salida de corchetes.

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

Y luego usarlo en la plantilla de esta manera:

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

Que luego produce:

{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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 20:37:21

Solo quería un enfoque ligeramente diferente. He intentado algunas otras otras formas y aquí hay algunas cosas que no me gustaron de ellas:

  1. Cambiar los corchetes Angular por defecto {{obj.property}} a otra cosa es una mala idea. Principalmente porque tan pronto como comience a usar componentes de terceros que no son conscientes de su configuración angular no estándar, los enlaces en esos componentes de terceros dejarán de funcionar. También vale la pena mencionar que el equipo de AngularJS no parece querer ir por la ruta de permitir múltiples notaciones de enlace, marque este problema
  2. Me gustan bastante las plantillas de bigote y no quiero cambiar todo el proyecto a otra cosa debido a este pequeño problema.
  3. Bastantes personas recomiendan no mezclar el renderizado del lado del cliente y del servidor. No estoy totalmente de acuerdo, creo que si está construyendo un sitio web de varias páginas que tiene pocas páginas con angular y algunas otras que son estáticas (algo así como acerca de nosotros o Términos y Condiciones páginas) está perfectamente bien usar plantillas del lado del servidor para facilitar el mantenimiento de esas páginas. Pero dicho esto, para las partes que son Angulares, no debe mezclar el renderizado del lado del servidor.

Ok no mi respuesta: Si está utilizando NodeJS y Express debe ser a lo siguiente:

Reemplace los enlaces {{}} en su parte angular con algo como {[{}]} (o algo completamente único)

Ahora en su ruta agregue una devolución de llamada a su método de renderizado:

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

Esto debería permitirle usar bigote junto con AngularJS. Una mejora que podría hacer es extraer ese método en un módulo separado para reutilizarlo en todas las rutas.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-17 10:17:40

Esta es una buena solución que he encontrado para este tipo de problema donde puede cambiar fácilmente los delimitadores en la configuración de la plantilla en tiempo de ejecución:

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

Puedes hacer la configuración de expresiones regulares así:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-24 20:33:21