Comment parcourir un tableau d'objets dans Handlebars?

108

Cela peut sembler une question idiote mais je n'arrive pas à trouver la réponse nulle part.

Je frappe cette API Web qui renvoie un tableau d'objets au format JSON:

tableau d'objets

La documentation de Handlebars montre l'exemple suivant:

<ul class="people_list">
  {{#each people}}
  <li>{{this}}</li>
  {{/each}}
</ul>

Dans le contexte de:

{
  people: [
    "Yehuda Katz",
    "Alan Johnson",
    "Charles Jolley"
  ]
}

Dans mon cas, je n'ai pas de nom pour le tableau, c'est juste l'objet racine de la réponse. J'ai essayé d'utiliser {{#each}}sans succès .

Première utilisation du guidon ... Que me manque-t-il?

METTRE À JOUR

Voici un violon simplifié pour vous montrer ce que je demande: http://jsfiddle.net/KPCh4/2/

Les guidons nécessitent-ils que la variable de contexte soit un objet et non un tableau?

emzero
la source
Comment transmettez-vous les résultats de l'API au modèle ( actuellement )?
Gabriele Petrioli
@ GabyakaG.Petrioli l'API n'est pas la mienne, je n'ai aucun contrôle dessus. J'utilise juste jQuery ajax et j'obtiens l'objet de réponse, qui est un tableau d'objets.
emzero

Réponses:

158

Vous pouvez passer thisà chaque bloc. Voir ici: http://jsfiddle.net/yR7TZ/1/

{{#each this}}
    <div class="row"></div>
{{/each}}
AZ.
la source
Alors est-il possible d'appeler le numéro d'index de la boucle externe {{#each people}}à l'intérieur de la boucle interne {{#each this}}? J'aime{{people@index}}
RegarBoy
18

Ce violon a à la fois eachet json direct. http://jsfiddle.net/streethawk707/a9ssja22/ .

Voici les deux façons d'itérer sur un tableau. L'une consiste à passer directement par json et l'autre à nommer le tableau json tout en le passant au détenteur de contenu.

Eg1: L'exemple ci-dessous appelle directement la clé json (data) à l'intérieur de la variable small_data.

En html, utilisez le code ci-dessous:

<div id="small-content-placeholder"></div>

Le ci-dessous peut être placé dans l'en-tête ou le corps du html:

<script id="small-template" type="text/x-handlebars-template">
    <table>
        <thead>
            <th>Username</th>
            <th>email</th>
        </thead>
        <tbody>
            {{#data}}
                <tr>
                    <td>{{username}}
                    </td>
                    <td>{{email}}</td>
                </tr>
            {{/data}}
        </tbody>
    </table>
</script>

Celui ci-dessous est prêt pour le document:

var small_source   = $("#small-template").html();
var small_template = Handlebars.compile(small_source);

Le ci-dessous est le json:

var small_data = {
            data: [
                {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "[email protected]" },
                {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "[email protected]" }
            ]
        };

Enfin, attachez le json au support de contenu:

$("#small-content-placeholder").html(small_template(small_data));

Exemple 2: itération utilisant chacun.

Considérez le json ci-dessous.

var big_data = [
            {
                name: "users1",
                details: [
                    {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "[email protected]" },
                    {username: "allison1", firstName: "Allison", lastName: "House", email: "[email protected]" },
                    {username: "ryan1", firstName: "Ryan", lastName: "Carson", email: "[email protected]" }
                  ]
            },
            {
                name: "users2",
                details: [
                    {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "[email protected]" },
                    {username: "allison2", firstName: "Allison", lastName: "House", email: "[email protected]" },
                    {username: "ryan2", firstName: "Ryan", lastName: "Carson", email: "[email protected]" }
                  ]
            }
      ];

En passant le json au détenteur de contenu, nommez-le simplement de cette manière:

$("#big-content-placeholder").html(big_template({big_data:big_data}));

Et le modèle ressemble à:

<script id="big-template" type="text/x-handlebars-template">
    <table>
        <thead>
            <th>Username</th>
            <th>email</th>
        </thead>
        <tbody>
            {{#each big_data}}
                <tr>
                    <td>{{name}}
                            <ul>
                                {{#details}}
                                    <li>{{username}}</li>
                                    <li>{{email}}</li>
                                {{/details}}
                            </ul>
                    </td>
                    <td>{{email}}</td>
                </tr>
            {{/each}}
        </tbody>
    </table>
</script>
faucon de rue
la source
Comment compiler cela en utilisant des guidons gulp?
webkitfanz
10

Je voulais dire dans l' template()appel ...

Il vous suffit de transmettre les résultats en tant qu'objet. Alors au lieu d'appeler

var html = template(data);

faire

var html = template({apidata: data});

et utilisez {{#each apidata}}dans votre code de modèle

démo sur http://jsfiddle.net/KPCh4/4/
( suppression du ifcode restant qui s'est écrasé )

Gabriele Petrioli
la source
3
C'est bien, mais la réponse AZ est meilleure. Utiliser {{#each this}}est la bonne forme.
emzero
en effet, cette manière a beaucoup plus de sens, merci!
woohoo
8

Les guidons peuvent utiliser un tableau comme contexte. Vous pouvez utiliser .comme racine des données. Ainsi, vous pouvez parcourir vos données de tableau avec {{#each .}}.

var data = [
  {
    Category: "General",
    DocumentList: [
      {
        DocumentName: "Document Name 1 - General",
        DocumentLocation: "Document Location 1 - General"
      },
      {
        DocumentName: "Document Name 2 - General",
        DocumentLocation: "Document Location 2 - General"
      }
    ]
  },
  {
    Category: "Unit Documents",
    DocumentList: [
      {
        DocumentName: "Document Name 1 - Unit Documents",
        DocumentList: "Document Location 1 - Unit Documents"
      }
    ]
  },
  {
    Category: "Minutes"
  }
];

$(function() {
  var source = $("#document-template").html();
  var template = Handlebars.compile(source);
  var html = template(data);
  $('#DocumentResults').html(html);
});
.row {
  border: 1px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0/handlebars.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<div id="DocumentResults">pos</div>
<script id="document-template" type="text/x-handlebars-template">
  <div>
  {{#each .}}
    <div class="row">
      <div class="col-md-12">
        <h2>{{Category}}</h2>
        {{#DocumentList}}
        <p>{{DocumentName}} at {{DocumentLocation}}</p>
        {{/DocumentList}}
      </div>
    </div>
  {{/each}}
  </div>
</script>

Emre Efendi
la source
1

Utilisation thiset {{this}}. Voir le code ci-dessous dans node.js:

var Handlebars= require("handlebars");
var randomList= ["James Bond", "Dr. No", "Octopussy", "Goldeneye"];
var source= "<ul>{{#each this}}<li>{{this}}</li>{{/each}}</ul>";
var template= Handlebars.compile(source);
console.log(template(randomList));

Sortie du journal de la console:

<ul><li>James Bond</li><li>Dr. No</li><li>Octopussy</li><li>Goldeneye</li></ul>
Megatron
la source