Wie greife ich über einen Index im Lenker auf ein Access-Array-Element zu?


270

Ich versuche, den Index eines Elements in einem Array innerhalb einer Lenkervorlage anzugeben:

{
  people: [
    {"name":"Yehuda Katz"},
    {"name":"Luke"},
    {"name":"Naomi"}
  ]
}

mit diesem:

<ul id="luke_should_be_here">
{{people[1].name}}
</ul>

Wenn dies nicht möglich ist, wie würde ich einen Helfer schreiben, der auf ein bestimmtes Element innerhalb des Arrays zugreifen kann?

Antworten:


409

Versuche dies:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>

26
das ist nirgendwo dokumentiert! Genial.
Lukemh

25
Ich Expecting 'ID'erhalte eine Fehlermeldung mit {{user.links.websites.1}} oder {{user.links.websites.0}}
Olivier Lalonde

131
@OlivierLalonde, ich musste so etwas benutzen {{ websites.[0] }}.
Matt

4
In der Tat, @Matt, das ist nicht nur ein glückliches Format, sondern eine Art dokumentierte Syntax. (Siehe meine Antwort.)
Arjan

5
Was ist mit dem letzten Element in einem Array?
Winduptoy

319

Das Folgende mit einem zusätzlichen Punkt vor dem Index funktioniert wie erwartet. Hier sind die eckigen Klammern optional, wenn auf den Index eine andere Eigenschaft folgt:

{{people.[1].name}}
{{people.1.name}}

Die eckigen Klammern sind jedoch erforderlich in:

{{#with people.[1]}}
  {{name}}
{{/with}}

In letzterem Fall würde die Verwendung der Indexnummer ohne eckige Klammern eine ergeben:

Error: Parse error on line ...:
...     {{#with people.1}}                
-----------------------^
Expecting 'ID', got 'INTEGER'

Nebenbei bemerkt: Die Klammern werden (auch) für die segmentliterale Syntax verwendet , um auf tatsächliche Bezeichner (keine Indexnummern) zu verweisen, die ansonsten ungültig wären. Weitere Details finden Sie unter Was ist eine gültige Kennung?

(Getestet mit Lenker in YUI.)

2.xx Update

Sie können jetzt den getHelfer dafür verwenden:

(get people index)

Wenn Sie jedoch eine Fehlermeldung erhalten, dass der Index eine Zeichenfolge sein muss, gehen Sie wie folgt vor:

(get people (concat index ""))

10
Dies sollte die Antwort sein, da sie gründlicher ist als die ausgewählte Antwort. Wenn ich eckige Klammern benötige, wenn der Index am Ende ist, bin ich eine Weile hängen geblieben!
Modulitos

das hat den Trick gemacht! danke ... die oben gewählte Antwort hat dies nicht getan, bitte markieren Sie dies als die richtige.
MarioAraya

1
Die {{#with people.1}}Lösung hat bei mir mit funktioniert com.github.jknack:handlebars:4.1.2.
Ferran Maylinch

21
{{#each array}}
  {{@index}}
{{/each}}

Genial, das ist die richtige Antwort. @index gibt Ihnen die Position im Array.
Oscar Romero

17

Wenn nicht dokumentierte Funktionen nicht Ihr Spiel sind, können Sie dies hier erreichen:

Handlebars.registerHelper('index_of', function(context,ndx) {
  return context[ndx];
});

Dann in einer Vorlage

{{#index_of this 1}}{{/index_of}}   

Ich habe das Obige geschrieben, bevor ich es bekommen habe

this.[0]

Ich kann nicht sehen, dass jemand mit dem Lenker zu weit kommt, ohne eigene Helfer zu schreiben.



8

Bitte versuchen Sie dies, wenn Sie zuerst / zuletzt abrufen möchten.

{{#each list}}

    {{#if @first}}
        <div class="active">
    {{else}}
        <div>
    {{/if}}

{{/each}}


{{#each list}}

    {{#if @last}}
        <div class="last-element">
    {{else}}
        <div>
    {{/if}}

{{/each}}

7

Während Sie ein Array mit schleifen each und anderen Array im Kontext des aktuellen Elements durchlaufen, tun Sie dies folgendermaßen.

Hier sind die Beispieldaten.

[
  {
    Name: 'foo',
    attr: ['boo', 'zoo']
  },
  {
    Name: 'Bar',
    attr: ['weit', 'zar']
  }}
]]

Hier ist der Lenker, um das erste Element im attrArray zu erhalten.

{{#jeder Spieler}}
  <p> {{this.name}} </ p>

  {{#with this.attr}}
    <p> {{this. [0]}} </ p>
  {{/mit}}

{{/jeder}}

Dies wird ausgegeben

<p> foo </ p>
<p> boo </ p>

<p> Balken </ p>
<p> weit </ p>

Wenn das attr-Array eine unterschiedliche Anzahl von Elementen für unterschiedliche Objekte enthält, wie wird es dann durchlaufen? Zum Beispiel: [{name: 'foo', attr: ['boo', 'zoo']}, {name: 'bar', attr: ['far', 'zar', 'sar]}] wie geht es dann? Wirst du das gesamte Attribut für jedes Objekt des Arrays anzeigen?
Partha Roy

Ich habe es nicht versucht, aber ich gehe davon aus, dass in {{#with this.attr}} thisstattthis.[0]
Fatih Acet

1

Die folgende Syntax kann auch verwendet werden, wenn das Array nicht benannt ist (nur das Array wird an die Vorlage übergeben):

  <ul id="luke_should_be_here">
  {{this.1.name}}
  </ul>

0

In meinem Fall wollte ich auf ein Array in einem benutzerdefinierten Helfer wie folgt zugreifen:

{{#ifCond arr.[@index] "foo" }}

Was nicht funktioniert hat, aber die von @julesbou vorgeschlagene Antwort hat funktioniert.

Arbeitscode:

{{#ifCond (lookup arr @index) "" }}

Hoffe das hilft! Prost.

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.