Ich beschäftige mich derzeit mit handlebars.js in einer express.js-Anwendung. Um die Dinge modular zu halten, habe ich alle meine Vorlagen in Teilvorlagen aufgeteilt.
Mein Problem : Ich konnte keinen Weg finden, Variablen durch einen Teilaufruf zu übergeben. Nehmen wir an, ich habe einen Teil, der so aussieht:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Nehmen wir an, ich habe diesen Teil mit dem Namen 'myPartial' registriert. In einer anderen Vorlage kann ich dann so etwas sagen wie:
<section>
{{> myPartial}}
</section>
Dies funktioniert gut, der Teil wird wie erwartet gerendert und ich bin ein glücklicher Entwickler. Was ich jetzt brauche, ist eine Möglichkeit, verschiedene Variablen durch diesen Aufruf zu übergeben, um beispielsweise innerhalb eines Teils zu überprüfen, ob eine Überschrift angegeben ist oder nicht. Etwas wie:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
Und die Anrufung sollte ungefähr so aussehen:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
oder so.
Ich weiß, dass ich alle benötigten Daten definieren kann, bevor ich eine Vorlage rendere. Aber ich brauche einen Weg, es so zu machen, wie es gerade erklärt wurde. Gibt es einen möglichen Weg?
quelle
this
, könnten Sie in Ihrem eigenen Kontext übergeben. Definieren Sie beispielsweise zusätzliche Daten, die übergeben werden sollen, z{new_variable: some_data}
.{{> partialName {new_variable: some_data} }}
key=value
. Gibt es ein Problem, das dies in Github abdeckt?Nur für den Fall, hier ist, was ich getan habe, um teilweise Argumente zu bekommen, irgendwie. Ich habe einen kleinen Helfer erstellt, der einen Teilnamen und einen Hash von Parametern verwendet, die an den Teil übergeben werden:
Das Wichtigste dabei ist, dass Lenkerhelfer einen Ruby-ähnlichen Hash von Argumenten akzeptieren . Im Hilfecode sind sie Teil des letzten Arguments der Funktion
options
- - in ihremhash
Mitglied. Auf diese Weise können Sie das erste Argument - den Teilnamen - erhalten und die Daten danach abrufen.Dann möchten Sie wahrscheinlich ein
Handlebars.SafeString
vom Helfer zurückgeben oder "Triple-Stash" verwenden{{{
, um zu verhindern, dass es doppelt entweicht.Hier ist ein mehr oder weniger vollständiges Nutzungsszenario:
Hoffe das hilft ... jemandem. :) :)
quelle
Dies ist sehr gut möglich, wenn Sie Ihren eigenen Helfer schreiben. Wir verwenden einen benutzerdefinierten
$
Helfer, um diese Art der Interaktion (und mehr) durchzuführen:quelle
hbs.registerPartials(path.join(__dirname, '/views/partials'), function() { utils.precompileHandlebarsPartials(hbs); }); // Pre compile the partials precompileHandlebarsPartials : function(hbs) { var partials = hbs.handlebars.partials; for (var partial in partials) { if (typeof partials[partial] === 'string') { partials[partial] = hbs.handlebars.compile(partials[partial]); } }; }
Dies kann auch in späteren Versionen des Lenkers mit der folgenden
key=value
Notation erfolgen:So können Sie bestimmte Werte an Ihren Teilkontext übergeben.
Referenz: Kontext für Teil # 182 unterschiedlich
quelle
Die akzeptierte Antwort funktioniert hervorragend, wenn Sie in Ihrem Teil nur einen anderen Kontext verwenden möchten. Sie können jedoch nicht auf den übergeordneten Kontext verweisen. Um mehrere Argumente zu übergeben, müssen Sie Ihren eigenen Helfer schreiben. Hier ist ein funktionierender Helfer für Lenker
2.0.0
(die andere Antwort funktioniert für Versionen<2.0.0
):Dann können Sie in Ihrer Vorlage Folgendes tun:
Und in Ihrem Teil können Sie auf diese Werte als Kontext zugreifen wie:
quelle
Klingt so, als ob Sie so etwas tun möchten:
Yehuda hat dir schon einen Weg gegeben, das zu tun:
Aber um zu verdeutlichen:
Um Ihrem Teil eigene Daten zu geben, geben Sie ihm einfach ein eigenes Modell innerhalb des vorhandenen Modells, wie folgt:
Mit anderen Worten, wenn dies das Modell ist, das Sie Ihrer Vorlage geben:
Fügen Sie dann ein neues Objekt hinzu, das dem Teil gegeben werden soll:
childContext
wird zum Kontext des Teils, wie Yehuda sagte - darin sieht es nur das Feldanother
, aber es sieht nicht (oder kümmert sich nicht um das Feldsome
). Wenn Sieid
das Modell der obersten Ebene hatten undid
es im childContext erneut wiederholen , funktioniert dies einwandfrei, da der Teil nur sieht, was sich darin befindetchildContext
.quelle
Ja, ich war spät dran , aber ich kann für Assemble- Benutzer hinzufügen : Sie können den integrierten
"parseJSON"
Helfer http://assemble.io/helpers/helpers-data.html verwenden . (Entdeckt in https://github.com/assemble/assemble/issues/416 ).quelle
Ich bin mir nicht sicher, ob dies hilfreich ist, aber hier ist ein Beispiel für eine Lenkervorlage mit dynamischen Parametern, die an einen Inline-Teil von RadioButtons übergeben werden, und dem Client (Browser), der die Optionsfelder im Container rendert.
Für meine Verwendung wird es mit Lenkern auf dem Server gerendert und lässt den Client es beenden. Mit ihm kann ein Formular-Tool Inline-Daten innerhalb des Lenkers ohne Helfer bereitstellen.
Hinweis: Für dieses Beispiel ist jQuery erforderlich
quelle