Gibt es eine integrierte Möglichkeit, die Eigenschaften eines Objekts zu durchlaufen?
Lesezeit: 5 Minuten
Ben
Gibt es eine Art Schnurrbart/Lenker durchzuschleifen Objekt Eigenschaften?
Also mit
var o = {
bob : 'For sure',
roger: 'Unknown',
donkey: 'What an ass'
}
Kann ich dann was machen in der Template-Engine das wäre gleichbedeutend
for(var prop in o)
{
// with say, prop a variable in the template and value the property value
}
?
Eingebaute Unterstützung seit Handlebars 1.0rc1
Unterstützung für diese Funktionalität wurde hinzugefügt zu Handlebars.js, sodass keine externen Helfer mehr benötigt werden.
Wie man es benutzt
Für Arrays:
{{#each myArray}}
Index: {{@index}} Value = {{this}}
{{/each}}
Für Objekte:
{{#each myObject}}
Key: {{@key}} Value = {{this}}
{{/each}}
Beachten Sie, dass nur Eigenschaften, die die übergeben hasOwnProperty Prüfung wird aufgezählt.
@Rafi: Ohne deine Datenstruktur zu kennen, kann man das nicht verstehen.
– Jon
22. Juli 2013 um 18:11 Uhr
@Rafi: meinst du nicht {{this.title}}?
– nevyn
17. Oktober 2013 um 9:43 Uhr
@qodeninja: Ganz einfach: So wie Sie sich auf die Werte in den obigen Beispielen beziehen – mit {{#each this}}. Ihre Begriffswahl ist auch verwirrend (was macht ein Objekt zur “höchsten Ebene” und ein anderes nicht? Was genau sind “vordefinierte” Schlüssel? usw.), also sollten Sie diese Konzepte vielleicht noch einmal überdenken.
– Jon
11. Februar 2014 um 9:42 Uhr
Wenn Sie sich nicht irren, ist dies nur mit v1.1.0 verfügbar, aber großartige Antwort, danke.
– Renars Sirotine
1. Juli 2015 um 14:23 Uhr
Wie machen Sie das nur für eine bestimmte Whitelist von Eigenschaften?
– Marco Prinz
28. Juli 2015 um 14:43 Uhr
Ben
Es ist eigentlich ganz einfach als Helfer zu implementieren:
Handlebars.registerHelper('eachProperty', function(context, options) {
var ret = "";
for(var prop in context)
{
ret = ret + options.fn({property:prop,value:context[prop]});
}
return ret;
});
Sieht gut aus, müssen Sie innerhalb der Schleife eine hasOwnProperty-Prüfung hinzufügen, damit Sie nicht über Prototypeigenschaften iterieren?
– Affen junge
28. November 2012 um 11:26 Uhr
Tolle Lösung @Ben. Falls jemand versucht, dies mit Ember zu verwenden, finden Sie in meiner Antwort unten die Lösung, damit es funktioniert.
– Fliegenfisch
29. Mai 2013 um 19:54 Uhr
Amit
BEARBEITEN: Lenker haben jetzt eine eingebaute Möglichkeit, dies zu erreichen; siehe die ausgewählte Antwort oben. Wenn Sie mit einfachem Schnurrbart arbeiten, gilt das Folgende weiterhin.
Moustache kann Elemente in einem Array durchlaufen. Daher würde ich vorschlagen, ein separates Datenobjekt zu erstellen, das so formatiert ist, dass Moustache damit arbeiten kann:
var o = {
bob : 'For sure',
roger: 'Unknown',
donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };
for (var prop in o){
if (o.hasOwnProperty(prop)){
mustacheFormattedData['people'].push({
'key' : prop,
'value' : o[prop]
});
}
}
Jetzt würde Ihre Schnurrbart-Vorlage in etwa so aussehen:
Am Ende ging ich mit Ihrem Vorschlag weiter, da ich sowieso einige zusätzliche Untereigenschaften übergeben muss. Danke für die Hilfe!
– Ben
30. Januar 2012 um 11:28 Uhr
Vielen Dank, Ihre Idee hat mir einen weiteren Tag der Suche nach Alternativen erspart. Diese Zeile ist der Schlüssel mustacheFormattedData = { ‘people’ : [] };
– Matt
2. September 2013 um 15:17 Uhr
Wie würden Sie das mit einem Array von “o”-Objekten machen?
– rot888
25. September 2014 um 19:49 Uhr
Die Antwort von @Amit ist gut, da sie sowohl in Moustache als auch in Handlebars funktioniert.
Was Nur-Lenker-Lösungen angeht, habe ich einige gesehen und die gefallen mir each_with_key Blockhelfer bei https://gist.github.com/1371586 der beste.
Es ermöglicht Ihnen, über Objektliterale zu iterieren, ohne sie zuerst umstrukturieren zu müssen, und
Es gibt Ihnen die Kontrolle darüber, was Sie die Schlüsselvariable nennen. Bei vielen anderen Lösungen müssen Sie bei der Verwendung von Objektschlüsseln mit dem Namen vorsichtig sein 'key'oder 'property'etc.
Danke @flynfish. Kontext ist eine Zeichenfolge in Ember? das scheint … etwas seltsam.
– Ben
30. Mai 2013 um 0:20 Uhr
Ja, ich bin mir nicht wirklich sicher, da ich neu bei Ember bin und immer noch versuche, mich darin zurechtzufinden.
– Fliegenfisch
30. Mai 2013 um 5:04 Uhr
Vielen Dank für Bens Lösung, mein Anwendungsfall, um nur bestimmte Felder der Reihe nach anzuzeigen
mit Objekt
Code:
handlebars.registerHelper('eachToDisplayProperty', function(context, toDisplays, options) {
var ret = "";
var toDisplayKeyList = toDisplays.split(",");
for(var i = 0; i < toDisplayKeyList.length; i++) {
toDisplayKey = toDisplayKeyList[i];
if(context[toDisplayKey]) {
ret = ret + options.fn({
property : toDisplayKey,
value : context[toDisplayKey]
});
}
}
return ret;
});
Quellobjekt:
{ locationDesc:"abc", name:"ghi", description:"def", four:"you wont see this"}
Schablone:
{{#eachToDisplayProperty this "locationDesc,description,name"}}
<div>
{{property}} --- {{value}}
</div>
{{/eachToDisplayProperty}}
Ausgabe:
locationDesc --- abc
description --- def
name --- ghi
Dies ist eine Hilfsfunktion für mustacheJS, ohne die Daten vorzuformatieren und sie stattdessen während des Renderns abzurufen.
var data = {
valueFromMap: function() {
return function(text, render) {
// "this" will be an object with map key property
// text will be color that we have between the mustache-tags
// in the template
// render is the function that mustache gives us
// still need to loop since we have no idea what the key is
// but there will only be one
for ( var key in this) {
if (this.hasOwnProperty(key)) {
return render(this[key][text]);
}
}
};
},
list: {
blueHorse: {
color: 'blue'
},
redHorse: {
color: 'red'
}
}
};
(Die Reihenfolge kann zufällig sein – es ist eine Karte) Dies kann nützlich sein, wenn Sie das gewünschte Kartenelement kennen. Achten Sie nur auf falsche Werte.
AamirR
Ich habe die alte Version verwendet 1.0.beta.6 des Lenkers, ich denke, irgendwo während 1.1 – 1.3 wurde diese Funktionalität hinzugefügt, also hat die Aktualisierung auf 1.3.0 das Problem gelöst, hier ist die Verwendung:
Verwendungszweck:
{{#each object}}
Key {{@key}} : Value {{this}}
{{/people}}
10195500cookie-checkGibt es eine integrierte Möglichkeit, die Eigenschaften eines Objekts zu durchlaufen?yes