2011-09-23 10 views
6

Realmente tengo problemas con las colisiones de nombres en mis plantillas de Moustache (usando Mustache.js). Este ejemplo ilustra esos dos problemas:¿Hay alguna forma de evitar las colisiones de nombres en estructuras anidadas en mis plantillas de Moustache.js?

estoy pasando estos datos:

{'recs': {'code': 'foo', 'id': 1 
      'childRecs': [{'id': 2}, 
         {'code': 'bar', 'id': 3}] 
     } 
} 

en esta plantilla:

{{#recs}} 
    Record ID: {{id}} 
    {{#childRecs}} 
    This child code is: [{{code}}] and its parent ID is: {{id}} 
    {{/childRecs}} 
{{/recs}} 

esperado:

Record ID: 1 
This child code is: [] and its parent ID is 1 
This child code is: [bar] and its parent ID is 1 

real:

Record ID: 1 
This child code is [foo] and its parent ID is 2 
This child code is [bar] and its parent ID is 3 
  1. No hay manera en el {{#childRecs}} bloque anidado para acceder al campo padre {{#recs}}{id}}{{/recs}} - se sobrescribe con el {{#childRecs}}{{id}}{{/childRecs}}

  2. Si una variable en {{#childRecs}} no está presente, y una variable de matriz de la misma nombre existe, no hay forma de evitar que imprima la variable principal.

Mis estructuras anidadas son muy profundas y hay muchos conflictos de nombres, por lo que renombrar ellos de tal manera que no choquen no es una opción viable. ¿Hay alguna otra forma de resolver mis problemas?

Respuesta

6

veo dos opciones:

  • enriquecen los datos en el lado del cliente antes de enviarlo para la representación. Por ejemplo, puede bucle sobre todos los childRecs y añadir una nueva propiedad parentId - y luego actualizar su plantilla en consecuencia, o

  • Uso http://www.handlebarsjs.com/ - Mantiene la sintaxis bigote, pero añade algunos extras como el acceso al contexto de los padres (a través del ../). Por ejemplo:

    {{#recs}} 
        Record ID: {{id}} 
        {{#childRecs}} 
         This child code is: [{{code}}] and its parent ID is: {{../id}} 
        {{/childRecs}} 
    {{/recs}} 
    
+0

terminé escribiendo una envoltura alrededor de Mustache.to_html que renombra recursivamente cada propiedad del objeto de datos anteponiendo un número de períodos iguales a la profundidad. Luego modifiqué mi plantilla para que coincida. De esta manera, debo especificar explícitamente la profundidad cada vez que uso una variable en la plantilla, y las variables son todas únicas. Handlebars.js parece tentador: no estoy seguro si ../ es la * única * forma de acceder a las propiedades principales, o si retrocede por defecto si no existe tal propiedad en el elemento secundario. No me gusta el repliegue. Lamentablemente, no parece haber un analizador PHP maduro para las plantillas de manubrio. –

+0

Originalmente, iba a agregar una propiedad parentId a cada objeto para hacer referencia a su elemento principal, pero el problema que encontré fue cuando la anidación tenía varios niveles de profundidad: no había forma de recorrer el árbol hasta llegar a un abuelo. Mustache.js no permite etiquetas anidadas con el mismo nombre, p. {{#parentId}} {{# parentId}} {{val}} {{/ parentId}} {{/ parentId}}, pero para un único nivel que funcionaría. –

+0

Me encontré con el mismo problema y acabo de agregar valores a mi vista. {{catID}} ahora es un campo dentro de mi vista {{sub-cat}}. Funciona ... aunque es otra llamada DB que prefiero no hacer. –

Cuestiones relacionadas