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?

lukemh
quelle

Antworten:

409

Versuche dies:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
Dhorrigan
quelle
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 ""))
Arjan
quelle
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}}
FMQB
quelle
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.

Bret Weinraub
quelle
9

Wenn Sie dynamische Variablen verwenden möchten

Das wird nicht funktionieren:

{{#each obj[key]}}
...
{{/each}}

Sie müssen tun:

{{#each (lookup obj key)}}
...
{{/each}}

Siehe Lenker-Suchhilfe und Unterausdrücke für Lenker .

julesbou
quelle
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}}
user1378423
quelle
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>
Fatih Acet
quelle
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>
José
quelle
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.

Sharukh Mastan
quelle