2012-06-20 16 views
7

Estoy usando la función _.template() de underscorejs junto con backbonejs. Al utilizar underscore.js v1.3.0, podría utilizar una sentencia if como se muestra:Si hay instrucciones condicionales en Underscore.js

<script type="text/template" id="tpl_listing_list_item"> 
    <% if(<%= address_2 %>){%>, <%= address_2 %><%}%> 
</script> 

Problema: Después de actualizar a v1.3.3, me sale el error Uncaught SyntaxError: Unexpected token ILLEGAL en la consola de Javascript. ¿Se ha eliminado esta característica? La eliminación del código if corrige el error. Si se elimina, ¿hay otra forma de lograr lo mismo?

Respuesta

8

En su declaración if ya ha escapado al modo de interpolación, por lo que <%= es un carácter ilegal.

Esto funciona cuando lo uso en mi navegador con 1.3.3

<script type="text/template" id="tpl_listing_list_item"> 
    <% if(address_2){ %>, <%= address_2 %> <% } %> 
</script> 

Ejemplo:

var t = _.template('{% if(address_2){ %}, {{ address_2 }} {% } %}') 
undefined 
t({'address_2': 'test'}); 
", test " 

(Utilizamos JSP para que nuestros códigos de plantilla son {% %}, {{ }}, y en lugar de {%- %} los valores predeterminados, así que disculpe mis etiquetas)

8

tkone lo tiene correcto, pero para una plantilla como la que tiene, puede usar la especial print function para limpiar sus etiquetas:

También puede usar print desde el código JavaScript. Esto a veces es más conveniente que usar <%= ... %>.

var compiled = _.template("<% print('Hello ' + epithet); %>"); 
compiled({epithet: "stooge"}); 
=> "Hello stooge." 

por lo que podría reducir el ruido de la siguiente manera:

<script type="text/template" id="tpl_listing_list_item"> 
    <% if(address_2){ print(', ', address_2) } %> 
</script> 

Demostración: http://jsfiddle.net/ambiguous/UgATZ/

+0

no tenía ninguna pista acerca de la función 'print'. ¡Aprenda algo nuevo cada día! – tkone

+2

@tkone: Aprende todo tipo de cosas citando la documentación en respuestas todo el tiempo :) –

Cuestiones relacionadas