2012-04-23 21 views
9

Ambos usan la misma sintaxis para insertar variables. Por ejemplo, si quiero el siguiente¿Cómo puedo usar las plantillas Underscore.js junto con EJS?

<%= username %> 

En mi Subrayado, mis principales rompe EJS porque trata de sustituir nombre de usuario y no existe dicha variable en la página principal.

+0

¿Por qué necesita ambos? ¿Y funcionan los corchetes, como se menciona aquí? http://code.google.com/p/embeddedjavascript/wiki/Testing – Marc

+1

Estoy usando EJS con Backbone.js – deltanovember

+0

¿están trabajando los corchetes para usted? – Marc

Respuesta

9

creo corchetes trabajarán en EJS por defecto:

[%= username %] 

Y si usted necesita para obtener más elegante, la página de GitHub EJS describe cómo crear etiquetas personalizadas:

var ejs = require('ejs'); 
ejs.open = '{{'; 
ejs.close = '}}'; 
  • Creo que la segunda parte "más elegante" podría ser específica de las aplicaciones del lado del servidor

https://github.com/visionmedia/ejs

Usando el ejemplo GitHub lado del cliente, que había necesidad de hacer una sintaxis como esta cuando se renderiza:

var html = require('ejs').render(users, { open: "^%", close: "%^" }); 

opciones son el segundo parámetro de la render().

10

Tuve este problema y pensé que compartiría la solución que encontré para resolver el problema del lado del cliente. Así es como su cambio de la expresión regular de escape (a través de underscore.js docs):

_.templateSettings = { 
    interpolate : /\{\{(.+?)\}\}/g 
}; 
var template = _.template("{{example_value}}"); 

Cambia el <% =%> a {{}}.

1

Tuve el mismo problema cuando quería renderizar la página web usando la plantilla ejs en back-end (express), mientras tanto tenía que usar la plantilla de subrayado en el front-end.

Probé la respuesta de Marc pero no ayuda, creo que no está actualizada para usar en una versión más nueva. En la versión más nueva de ejs (el mío es 2.3.3), ya no puede usar ejs.open y ejs.close, use ejs.delimiter en su lugar.

Cambié el delimitador a '$' en ejs por lo que ejs solo manejaría con la etiqueta <$ $> para insertar variables y tomar la etiqueta <% %> como sintaxis sin sentido.

app.set('view engine', 'ejs'); 
var ejs = require('ejs'); 
ejs.delimiter = '$'; 
app.engine('ejs', ejs.renderFile); 

NOTA: agrego el código anterior en app.js archivo en aplicaciones expresas y funcionó bien, y si quieres usarlo en front-end, sólo tiene que pasar {'delimiter': '$'} en ejs.render(str, options) como argumento opciones.

0

Recientemente me encontré con este problema y no quería volver a configurar EJS, así que cambié cómo el subrayado interpola, evalúa y escapa de valores.

Por defecto, estos son los valores actuales del guión de plantillas:

_.templateSettings = { 
    interpolate: /<%([\s\S]+?)%>/g, 
    evaluate: /<%=([\s\S]+?)%>/g, 
    escape: /<%-([\s\S]+?)%>/g 
}; 

Entonces ha actualizado la configuración para:

_.templateSettings = { 
    interpolate: /\{\{=([^}]*)\}\}/g, 
    evaluate: /\{\{(?!=)(.*?)\}\}/g, 
    escape: /\{\{-([^}]*)\}\}/g 
}; 

En otras palabras, el fragmento anterior cambiará lo siguiente en subrayado:

  • Interpolar

    • Desde: <%= ... %>
    • Para: {{= ... }}
    • Expresión: /\{\{=([^}]*)\}\}/g
  • Evaluar

    • Desde: <% ... %>
    • Para: {{ ... }}
    • Expresión: /\{\{(?!=)(.*?)\}\}/g
  • escape

    • De <%- ... %>
    • Para: {{- ... }}
    • Expresión: /\{\{-([^}]*)\}\}/g

Entonces mi plantilla subrayado es así:

// Underscore 
<script type="text/template"> 
    <ul> 
    {{ _.each(collection, function(model) { }} 
    <li>{{= model.text }}</li> 
    <li>{{- model.textEscaped }}</li> 
    {{ }); }} 
    </ul> 
</script> 

... y mis plantillas EJS siguen siendo los mismos y puedo seguir utilizando la sintaxis ERB por defecto para interpolar/evalúa valores: <% ... %> y <%= ... %>:

// EJS 
<% if (isAuthenticated) { %> 
    <%= user.displayName %> 
<% } %> 
Cuestiones relacionadas