javascript - Hur får jag åtkomst till ett arrayelement med index i handlebars?
Jag försöker specificera indexet för ett objekt i en array inom en Handlebars-mall:
{
people: [
{"name":"Yehuda Katz"},
{"name":"Luke"},
{"name":"Naomi"}
]
}
använder detta:
<ul id="luke_should_be_here">
{{people[1].name}}
</ul>
Om det ovanstående inte är möjligt, hur skulle jag skriva en hjälpfunktion som kan komma åt ett specifikt objekt i arrayen?
Svar #1
Prova detta:
<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
Svar #2
Följande, med en extra punkt före indexet, fungerar precis som förväntat. Här är hakparenteserna valfria när indexet följs av en annan egenskap:
{{people.[1].name}}
{{people.1.name}}
Dock krävs hakparenteserna i:
{{#with people.[1]}}
{{name}}
{{/with}}
I det senare skulle man genom att använda indexnumret utan hakparenteserna få:
Error: Parse error on line ...:
... {{#with people.1}}
-----------------------^
Expecting 'ID', got 'INTEGER'
För övrigt: parenteserna används (också) för segment-literal syntax, för att referera till faktiska identifierare (inte indexnummer) som annars skulle vara ogiltiga. Fler detaljer i Vad är en giltig identifierare?
(Testat med Handlebars i YUI.)
2.xx Uppdatering
Du kan nu använda get-hjälpen för detta:
(get people index)
men om du får ett fel om att index måste vara en sträng, gör:
(get people (concat index ""))
Svar #3
{{#each array}}
{{@index}}
{{/each}}
Svar #4
Om odokumenterade funktioner inte är din grej, kan samma sak uppnås här:
Handlebars.registerHelper('index_of', function(context,ndx) {
return context[ndx];
});
Sedan i en mall
{{#index_of this 1}}{{/index_of}}
Jag skrev ovanstående innan jag fick tag på
this.[0]
Jag kan inte se någon komma särskilt långt med Handlebars utan att skriva sina egna hjälpfunktioner.
Svar #5
Om du vill använda dynamiska variabler
Det här kommer inte att fungera:
{{#each obj[key]}}
...
{{/each}}
Du behöver göra:
{{#each (lookup obj key)}}
...
{{/each}}
se handlebars lookup-helper och handlebars underuttryck.
Svar #6
Var vänlig prova detta, om du vill hämta först/sist.
{{#each list}}
{{#if @first}}
<div class="active">
{{else}}
<div>
{{/if}}
{{/each}}
{{#each list}}
{{#if @last}}
<div class="last-element">
{{else}}
<div>
{{/if}}
{{/each}}
Svar #7
Medan du loopar i en array med each, och om du vill komma åt en annan array i kontexten av det aktuella objektet gör du det på det här sättet.
Här är exempeldata.
[
{
name: 'foo',
attr: [ 'boo', 'zoo' ]
},
{
name: 'bar',
attr: [ 'far', 'zar' ]
}
]
Här är handlebars för att få det första objektet i attr-arrayen.
{{#each player}}
<p> {{this.name}} </p>
{{#with this.attr}}
<p> {{this.[0]}} </p>
{{/with}}
{{/each}}
Detta kommer att skriva ut
<p> foo </p>
<p> boo </p>
<p> bar </p>
<p> far </p>
