2011-12-27 12 views
15

Estoy usando la biblioteca de plantillas underscore.js, y no estoy seguro de cómo usar una lógica dentro de una plantilla. por ejemplo, me gustaría imprimir una matriz de etiquetas en una plantilla. ¿Cuál es el mejor enfoque para esto?cómo imprimir una matriz en la plantilla underscore.js?

Javascript:

bunny_data = { 
    name: "sprinkles", 
    age: 1, 
    tags: ['fuzzy','wuzzy'] 
}; 

bunny_view = $("#bunny-template").html(); 
$(body).append(_.template(bunny_view,bunny_data)); 

Plantilla:

<script type='text/template'> 
    <div> 
    <h5><% = name %></h5> 
    <ul class='tag-list'> 
     <!-- How do I print the tags here? --> 
    </ul> 
    </div> 
</script> 

Respuesta

30

No necesita encapsular bunny_data como sugiere @Ken, estaba en el camino correcto. Si usted desea o no llamar a las funciones _. o simplemente usar construcciones de JavaScript planas depende de usted, pero no hay construcciones de flujo integradas en las plantillas de Subrayado, para hacer eso solo debe incrustar el código (puede consultar eco o Mustache o algo si quieres eso).

Mi ejemplo es el siguiente (casi lo mismo que es el propietario):

<script type='text/template' id="bunny-template"> 
    <div> 
    <h5><%= name %></h5> 
    <ul> 
     <% for(var tag in tags) { %> 
      <li><%= tags[tag] %></li> 
     <% } %> 
    </ul> 
    </div> 
</script> 

con la siguiente Javascript:

bunny_data = { 
    name: "sprinkles", 
    age: 1, 
    tags: ['fuzzy','wuzzy'] 
}; 

bunny_view = $("#bunny-template").html(); 
$(body).append(_.template(bunny_view, bunny_data)); 

Puede comprobar que se ejecuta here.

(En una nota de preferencia personal, soy un usuario importante de todo el subrayado excepto las plantillas por este motivo, no me siento cómodo con la cantidad de código que debe poner en ellos si tiene un uso más complicado caso).

+0

cuál es la diferencia entre <%=%> y <%%>? – Allen

+3

<%= %> muestra el resultado de la expresión dentro de su cláusula, <% %> simplemente ejecuta el código dentro de su cláusula (si 'return' en un <% %>, será funcionalmente equivalente a <%= %>). E.g: <% 'foo' %> no genera nada, <%= 'foo' %> salidas 'foo'. –

+0

Jacob Oscarson tiene la mejor manera, pero ahora esto está obsoleto. el nuevo javascript debe tener el siguiente JavaScript: bunnyview = _.template ($ ("# bunny-template"). Html()); $ (cuerpo).append (bunnyview (bunny_data)); – Cantinos

8

Parece que no está configurando bunny_data correctamente en su JavaScript.

En lugar de:

$(body).append(_.template(bunny_view,bunny_data)); 

Probar:

$(body).append(_.template(bunny_view, { bunny_data: bunny_data })); 

Imprimir los datos de la plantilla (aviso Quité el espacio después% en <%= name %>):

<script type='text/template'> 
    <div> 
    <h5><%= name %></h5> 
    <ul class='tag-list'> 
     <% _.each(bunny_data, function(bd) { %> 
     <li><%= bd.name %></li> 
     ... 
     <% }); %> 
    </ul> 
    </div> 
</script> 

Esperemos que ayuda

7

también join hará el truco, por lo que en html que tendrá

<ul> 
    <li><%= tags.join('</li><li>') %></li> 
</ul> 

contrólela jsFiddle.

+1

sin ofender, pero para interponer ''

  • '' por artículo parece bastante hacky – Kristian

  • +0

    es, @Kristian –

    +0

    Hacky, pero el más conciso –

    Cuestiones relacionadas