2011-09-02 11 views
27

¿Cuál es la mejor manera de verificar una propiedad no definida en una plantilla ejs?¿Cómo verificaría la propiedad indefinida en ejs para node.js?

(estoy usando el node.js package por TJ Holowaychuk)

Ejemplo:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz" } })); 

yo esperaría que esto render "foo indefinido". Lanza un error foo undefined en su lugar.

Sé que esto no se supone que sea un problema, ya que este es el comportamiento esperado in the tests. ¿Hay alguna manera fácil de evitar esto?

La única solución que encontré es usar el método hasOwnProperty.

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

Este no lanza ningún error.

¿Hay alguna manera mejor de mantener la plantilla limpia? ¿O por qué arroja este error?

Respuesta

49

Otra forma de comprobar si una propiedad es hacer referencia a ella indirectamente a través del objeto locals . Usando su ejemplo:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 
+0

Esto es lo que quería. :) – pvorb

+6

Justo lo que necesitaba, pero, ¿por qué tienes que hacer esto? :) –

+0

No estoy seguro sin consultar la fuente, pero sospecho que el motor de la plantilla no se molesta en buscar variables para valores indefinidos. –

15

Yo usaría typeof, como en if (typeof foo == 'undefined'). Uso el operador typeof con la cadena "indefinido", mientras que algunas personas pueden hacer una comparación directa con la variable global undefined. Prefiero este método porque está protegido contra algún desarrollador de biblioteca terrorista JS cambiando el valor de la variable global, dejando tu código dañado.

Esto también podría ser expresados ​​como un ternario, que algunos vista como "más limpia" debido a la ausencia de curlies:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<%) %>'; 
+1

Esto funciona y tal vez es la que formalmente correcta. Pero personalmente no me gusta, ya que es demasiado largo para mis plantillas. – pvorb

+1

Tenga en cuenta que este es el único método que funcionará con las plantillas EJS del lado del cliente. Los otros métodos se basan en verificar el objeto 'res' que no existirá con las plantillas del lado del cliente. – dbasch

9

más simple y más limpio en mi opinión:

<%= (!!locals.foo)?foo:'' %>

+3

lugareños parece haberse movido al objeto res en versiones posteriores de ejs. – dbasch

Cuestiones relacionadas