Wie iteriere ich über ein Array von Objekten im Lenker?


107

Dies mag eine dumme Frage sein, aber ich kann nirgendwo eine Antwort finden.

Ich treffe auf diese Web-API, die ein Array von Objekten im JSON-Format zurückgibt:

Array von Objekten

Die Lenkerdokumente zeigen das folgende Beispiel:

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

Im Zusammenhang mit:

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

In meinem Fall habe ich keinen Namen für das Array, es ist nur das Stammobjekt der Antwort. Ich habe versucht, {{#each}}ohne Glück zu verwenden.

Erstmalige Verwendung von Lenkern ... Was fehlt mir?

AKTUALISIEREN

Hier ist eine vereinfachte Geige, um Ihnen zu zeigen, was ich frage: http://jsfiddle.net/KPCh4/2/

Erfordert der Lenker, dass die Kontextvariable ein Objekt und kein Array ist?


Wie übergeben Sie die API-Ergebnisse ( derzeit ) an die Vorlage ?
Gabriele Petrioli

@ GabyakaG.Petrioli die API ist nicht meine, ich habe keine Kontrolle darüber. Ich verwende nur jQuery Ajax und erhalte das Antwortobjekt, bei dem es sich um ein Array von Objekten handelt.
Emzero

Antworten:


156

Sie können thisan jeden Block übergeben. Siehe hier: http://jsfiddle.net/yR7TZ/1/

{{#each this}}
    <div class="row"></div>
{{/each}}

Ist es dann möglich, die Indexnummer der äußeren Schleife {{#each people}}innerhalb der inneren Schleife aufzurufen {{#each this}}? Gefällt {{people@index}}
mir

16

Diese Geige hat beides eachund direkten json. http://jsfiddle.net/streethawk707/a9ssja22/ .

Im Folgenden sind die beiden Möglichkeiten zum Iterieren über ein Array aufgeführt. Einer ist mit direkter JSON-Übergabe und ein anderer benennt das JSON-Array, während er an den Inhaltsinhaber übergeben wird.

Beispiel 1: Im folgenden Beispiel wird der JSON-Schlüssel (Daten) direkt in der Variablen small_data aufgerufen.

Verwenden Sie in HTML den folgenden Code:

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

Das Folgende kann in den Header oder Body von HTML eingefügt werden:

<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>

Das folgende Dokument ist fertig:

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

Das Folgende ist der json:

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

Zum Schluss den json an den Inhaltsinhaber anhängen:

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

Beispiel 2: Iteration mit jedem.

Betrachten Sie den folgenden json.

var big_data = [
            {
                name: "users1",
                details: [
                    {username: "alan1", firstName: "Alan", lastName: "Johnson", email: "alan@test.com" },
                    {username: "allison1", firstName: "Allison", lastName: "House", email: "allison@test.com" },
                    {username: "ryan1", firstName: "Ryan", lastName: "Carson", email: "ryan@test.com" }
                  ]
            },
            {
                name: "users2",
                details: [
                    {username: "alan2", firstName: "Alan", lastName: "Johnson", email: "alan@test.com" },
                    {username: "allison2", firstName: "Allison", lastName: "House", email: "allison@test.com" },
                    {username: "ryan2", firstName: "Ryan", lastName: "Carson", email: "ryan@test.com" }
                  ]
            }
      ];

Während Sie den JSON an den Inhaltsinhaber weitergeben, benennen Sie ihn einfach folgendermaßen:

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

Und die Vorlage sieht aus wie:

<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>

Wie kompiliert man das mit dem Schlucklenker?
Webkitfanz

10

Ich meinte in dem template()Anruf ..

Sie müssen nur die Ergebnisse als Objekt übergeben. Also anstatt anzurufen

var html = template(data);

machen

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

und {{#each apidata}}in Ihrem Vorlagencode verwenden

Demo unter http://jsfiddle.net/KPCh4/4/
( entfernt einen Restcode if, der abgestürzt ist )


3
Das ist schön, aber die Antwort von AZ ist besser. Verwenden {{#each this}}ist die richtige Form.
Emzero

in der Tat macht dieser Weg viel mehr Sinn, danke!
woohoo

8

Lenker können ein Array als Kontext verwenden. Sie können .als Stamm der Daten verwenden. So können Sie Ihre Array-Daten mit durchlaufen {{#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>


1

Verwenden von thisund {{this}}. Siehe Code unten in 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));

Konsolenprotokollausgabe:

<ul><li>James Bond</li><li>Dr. No</li><li>Octopussy</li><li>Goldeneye</li></ul>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.