2012-01-25 10 views
6

Estoy usando el motor de plantillas de subrayado de la red troncal con los patrones de formato de bigote.plantilla de red troncal/subrayado en formato de bigote que causa un error en el símbolo # libra/hash?

Ya lo he usado con éxito en otro lugar del proyecto, pero ahora por primera vez estoy usando los patrones de lista de bucles de bigote para rellenar la plantilla que arroja un error que estoy un poco desconcertado. El error en cromo es:

"Uncaught SyntaxError: Unexpected token ILLEGAL" 

y puntos de función de plantilla de subrayado en el trazado inverso, que es bastante inútil pero en Firebug me sale un error más útiles de esta manera:

enter image description here

Sugiriendo que el símbolo de hash '#' es el problema, lo cual tendría sentido ya que sé que el bigote funciona bien, ya que hay muchas otras partes del proyecto que lo usan bien, también esta es la primera vez que estoy usando el hash sybol en mis plantillas. Parece un problema con la función de bucle o con la interpola configuración de la configuración/plantilla para subrayado.

Aquí está el dato relevante de mi plantilla:

<div class="thumblist thumblistleft" id="currentprojectslist"> 
    <div class="thumb-list-header"> 
     <h2>current projects</h2> 
    </div> 
    <div class="thumb-list-area"> 
     <ol> 
     {{#worklist}}  <!----- LOOK HERE ---> 
      {{#current}} 
       <li><a>{{title}}</a></li> 
      {{/current}} 
     {{/worklist}} 
     </ol> 
    </div> 
</div> 

y aquí es una muestra de la JSON (que todos valida fina)

{blah blah blah lot in here before,"worklist":[{"thumb":"img/project-s.jpg","id":"340","title":"Test Project One","desc":"big load of content here","current":true}], and so on....} 

estaba inicialmente siguiendo este ejemplo aquí por referencia: http://mustache.github.com/#demo

AHORA HERES DONDE PIENSO QUE EL PROBLEMA PUEDE SER:

underscore.js sugiere el uso de este antes de renderizar una plantilla bigote:

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

también:

interpolate : /\{\{(.+?)\}\}/g 

También a la declaración de interpolación, He intentado tanto. Sin embargo, mi conocimiento de la expresión regular es realmente pobre y tengo la sensación de que no puede acomodar el hash? En cualquier caso ... Estoy totalmente perplejo. ¿Alguien me puede ayudar aquí?

¿es posible hacer un bucle como este? buscando en la fuente de subrayado no estoy seguro: http://documentcloud.github.com/underscore/docs/underscore.html#section-120

Muchas gracias

+0

El patrón '/ \ {\ {([\ s \ S] +?) \} \}/g' coincidirá con' {{# foo}} 'y captura' # foo'. Podría evitar capturar el hash usando '/ \ {\ {#? ([\ S \ S] +?) \} \}/G', aunque creo que causará otros problemas. – Qtax

+0

¿alguna vez te las arreglaste para hacer un bucle así? Realmente me gustaría, es muy molesto en subrayado escribir un simple si en varias líneas de evaluación para comprobar si hay una bandera presente en mi JSON. – Daniel

+0

hey, por desgracia subrayar no lo hará de forma nativa, debe incluir mustache.js y hacer bigote.render, como a continuación ... Es realmente molesto estoy de acuerdo – Alex

Respuesta

7

les dejo para el bien de los de cualquier otra persona frente a este problema. Después de buscar en Google sin éxito, revisé la fuente de underscore.js con un peine de dientes finos y, básicamente, tiene que utilizar la sintaxis de la plantilla del subrayado, escribir procesadores de funciones desagradables en su JSON o incluir el bigote.js en su origen y llamar:

Mustache.render(mytemplate,mymodel) 

y foresake de

_.template(..) function 

molesto guión bajo, pero lo que sea, espero que ayude a alguien

23

se enfrentó a este problema hoy en día. El problema parece ser el orden en que Underscore realiza la creación de plantillas: escape, interpole y luego evalúe. Así que hay que ignorar explícitamente ninguna coincidencia para {{# en su expresión regular de interpolación:

_.templateSettings = { 
    evaluate: /\{\{#([\s\S]+?)\}\}/g,   // {{# console.log("blah") }} 
    interpolate: /\{\{[^#\{]([\s\S]+?)[^\}]\}\}/g, // {{ title }} 
    escape:  /\{\{\{([\s\S]+?)\}\}\}/g,   // {{{ title }}} 
} 

en realidad no funcionan de la misma manera que el bigote: no hay bloques adecuados en plantillas de Subrayado, así que no hay necesidad de un bloque de cierre {{/}}. Solo necesita hacer coincidir sus declaraciones como lo haría con las plantillas de subrayado estándar.

+0

Tenga en cuenta que con la sintaxis anterior debe asegurarse de que hay un espacio entre tu expresión y el '{{}}'. Ejemplo: '{{test}}' funcionará, '{{test}}' no. – Niyaz

1

no estoy utilizando el símbolo #, pero he experimentado un error similar una vez traté de usar la triple bigote {{{name}}} para los valores sin escape con los ajustes:

interpolate : /\{\{\{(.+?)\}\}\}/g, 
escape : /\{\{(.+?)\}\}/g, 

Si esa es la razón por la que vinieron aquí, la siguiente ajuste funciona

interpolate : /\{\{\{(\s*\w+?\s*)\}\}\}/g, 
escape : /\{\{(\s*\w+?\s*)\}\}(?!\})/g, 

probé formato de Max, pero que no funcionó para mí porque tengo una mezcla de expresiones dobles y triples bigote y mientras la triple expresión funcionó bien se estaba desnudando un carácter de cada extremo de la variable nombre en el bigote doble es decir, {{title}} llevado a guión bajo buscando una variable llamada itl

+0

Vine aquí por la pregunta original, seguí las respuestas y esta expresión regular fue lo que funcionó para mí, ¡gracias! –

Cuestiones relacionadas