2011-09-23 1 views
6

J'ai vraiment des problèmes avec les collisions de noms dans mes modèles Moustache (en utilisant Moustache.js). Cet exemple illustre ces deux problèmes:Existe-t-il un moyen de contourner les collisions de noms dans les structures imbriquées dans mes modèles Moustache.js?

Je passe ces données:

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

Dans ce modèle:

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

attendu:

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

Actual:

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. Il n'y a aucun moyen dans le bloc {{#childRecs}} imbriqué pour accéder au champ parent {{#recs}}{id}}{{/recs}} - il est écrasé par le {{#childRecs}}{{id}}{{/childRecs}}

  2. Si une variable {{#childRecs}} est manquante, et une variable parent du même nom existe, il n'y a aucun moyen de l'empêcher d'imprimer la variable parent.

Mes structures imbriquées sont très profondes et il y a beaucoup de collisions de noms, afin de les renommer de telle sorte qu'ils ne se touchent pas est pas une option viable. Y a-t-il un autre moyen de résoudre mes problèmes?

Répondre

6

Je vois deux options:

  • Enrich les données du côté client avant de l'envoyer pour le rendu. Par exemple, vous pouvez boucler sur tous les childRecs et ajouter une nouvelle propriété parentId - puis mettre à jour votre modèle en conséquence, ou

  • Utilisez http://www.handlebarsjs.com/ - il garde la syntaxe de la moustache, mais ajoute quelques goodies comme l'accès au contexte parent (à travers ../). Par exemple:

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

J'ai fini par écrire un wrapper autour Mustache.to_html qui renomme récursive chaque propriété de l'objet de données par préfixer un certain nombre de périodes égales à la profondeur. Ensuite, j'ai modifié mon modèle pour correspondre. De cette façon, je dois spécifier explicitement la profondeur chaque fois que j'utilise une variable dans le modèle, et les variables sont toutes uniques. Handlebars.js semble tentant - pas sûr si ../ est la seule façon d'accéder aux propriétés parentes, ou si elle revient par défaut si aucune propriété n'existe sur l'enfant. Je n'aime pas le retour. Malheureusement, il ne semble pas y avoir d'analyseur PHP mature pour les modèles de guidon. –

+0

A l'origine j'allais ajouter une propriété parentId à chaque objet pour référencer son parent, mais le problème que j'ai rencontré était quand l'emboîtement était profond de plusieurs niveaux - il n'y avait aucun moyen de traverser l'arbre jusqu'à un grand-parent. Moustache.js n'autorise pas les balises imbriquées portant le même nom, par ex. {{#parentId}} {{# parentId}} {{val}} {{/ parentId}} {{/ parentId}}, mais pour un seul niveau qui fonctionnerait. –

+0

J'ai rencontré le même problème et ajouté des valeurs à mon affichage. {{catID}} est maintenant un champ dans ma vue {{sub-cat}}. Cela fonctionne ... bien que ce soit un autre appel de DB que je préfère ne pas faire. –

Questions connexes