Gibt es eine schöne, saubere Möglichkeit, eine Zeichenfolge und eine Variable zu einem Variablennamen zu verketten, den Jade verstehen kann?
Im Idealfall würde es ungefähr so aussehen:
each #{shape + 'Text'} in #{shape + 'Texts'}
li #{shape + 'Text'}
Ich habe versucht, window[shape + 'Text']
zu verwenden, aber das schien nicht zu funktionieren. Vielleicht habe ich es falsch gemacht?
Hier ist, warum ich das tun möchte:
Ich habe ein Array namens shapes
, das so aussieht: ['square', 'triangle', 'circle']
Ich verwende Jades each ... in ...
-Funktion, um dieses Array zu durchlaufen. Innerhalb jeder Iteration meiner Funktion muss ich ein weiteres each ... in ...
eines der wenigen anderen Arrays ausführen. Anstatt eine direkte Variable zu verwenden, um auszuwählen, über welches Array wie each shape in shapes
iteriert werden soll, möchte ich shape
mit einer Zeichenfolge verketten, um etwas wie each squareText in squareTexts
oder {{X5 zu erhalten }}.
Derzeit verwende ich Bedingungen, um mein gewünschtes Ergebnis zu erzielen, aber es ist ausführlich und nicht im minimalistischen Geist der Sprache.
Vielen Dank im Voraus für jeden Rat.
4 Antworten
In meinem Fall besteht der Trick darin, die eval()
-Funktion von Javascript zu verwenden, um den Variablennamen und die Zeichenfolge zu einem neuen Variablennamen zu verketten. Hier ist meine erfolgreiche (und prägnante) Implementierung.
- var items = eval(shape + 'Texts');
each item, i in items
li #{items[i]}
Sie können eine Variable und eine Zeichenfolge in Klammern setzen.
each item, i in items
li=(shape + 'Texts')
Ich würde vorschlagen, eine Option zu prüfen, um dies aus Jade heraus zu erstellen / zu bewerten, und den Jade-Code (und alle Vorlagen für diese Angelegenheit) so einfach wie möglich zu halten.
Ich folge nicht genau dem, worauf Sie sich beziehen, da ich jade
überhaupt nicht kenne, aber Sie würden ein Array wie dieses durchlaufen.
var a = ['square', 'triangle', 'circle'];
var i, l, item;
l = a.length;
for (i = 0; i < l; i++) {
item = a[i];
// At this point, you can refer to window[item + 'Text']
// but I'm not sure what that is supposed to mean.
}
Es gibt auch ein Array.prototype.every verfügbar, aber ich mache mir normalerweise nicht die Mühe, es in ältere Browser einzupacken.