Je travaille actuellement avec handlebars.js dans une application express.js. Pour garder les choses modulaires, j'ai divisé tous mes modèles en partiels.
Mon problème : je n'ai pas trouvé de moyen de passer des variables via une invocation partielle. Disons que j'ai un partiel qui ressemble à ceci:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Supposons que j'ai enregistré ce partiel avec le nom «myPartial». Dans un autre modèle, je peux alors dire quelque chose comme:
<section>
{{> myPartial}}
</section>
Cela fonctionne bien, le partiel sera rendu comme prévu et je suis un développeur heureux. Mais ce dont j'ai besoin maintenant, c'est d'un moyen de passer différentes variables à travers cette invocation, pour vérifier dans un partiel par exemple, si un titre est donné ou non. Quelque chose comme:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
Et l'invocation devrait ressembler à ceci:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
ou alors.
Je sais que je suis capable de définir toutes les données dont j'ai besoin, avant de rendre un modèle. Mais j'ai besoin d'un moyen de le faire comme je viens de l'expliquer. Y a-t-il un moyen possible?
la source
this
, pourriez-vous passer dans votre propre contexte. Par exemple, définissez des données supplémentaires à transmettre, telles que{new_variable: some_data}
?{{> partialName {new_variable: some_data} }}
key=value
. Y a-t-il un problème pour couvrir cela dans github?Juste au cas où, voici ce que j'ai fait pour obtenir des arguments partiels, en quelque sorte. J'ai créé un petit assistant qui prend un nom partiel et un hachage de paramètres qui seront passés au partiel:
L'essentiel ici est que les assistants Handlebars acceptent un hachage d'arguments de type Ruby . Dans le code d'assistance, ils font partie du dernier argument de la fonction
options
- - dans sonhash
membre. De cette façon, vous pouvez recevoir le premier argument - le nom partiel - et obtenir les données après cela.Ensuite, vous voudrez probablement renvoyer a
Handlebars.SafeString
de l'assistant ou utiliser «triple-stash» -{{{
- pour l'empêcher de double échapper.Voici un scénario d'utilisation plus ou moins complet:
J'espère que cela aide… quelqu'un. :)
la source
C'est très possible si vous écrivez votre propre aide. Nous utilisons une
$
aide personnalisée pour accomplir ce type d'interaction (et plus):la source
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]); } }; }
Cela peut également être fait dans les versions ultérieures du guidon en utilisant la
key=value
notation:Vous permettant de transmettre des valeurs spécifiques à votre contexte partiel.
Référence: Contexte différent pour le partiel # 182
la source
La réponse acceptée fonctionne très bien si vous souhaitez simplement utiliser un contexte différent dans votre partiel. Cependant, il ne vous permet de référencer aucun des contextes parent. Pour transmettre plusieurs arguments, vous devez écrire votre propre assistant. Voici une aide de travail pour Handlebars
2.0.0
(l'autre réponse fonctionne pour les versions<2.0.0
):Ensuite, dans votre modèle, vous pouvez faire quelque chose comme:
Et dans votre partiel, vous pourrez accéder à ces valeurs sous forme de contexte comme:
la source
On dirait que vous voulez faire quelque chose comme ceci:
Yehuda vous a déjà donné un moyen de le faire:
Mais pour clarifier:
Pour donner à votre partiel ses propres données, donnez-lui simplement son propre modèle à l'intérieur du modèle existant, comme ceci:
En d'autres termes, s'il s'agit du modèle que vous donnez à votre modèle:
Ajoutez ensuite un nouvel objet à donner au partiel:
childContext
devient le contexte du partiel comme Yehuda l'a dit - en cela, il ne voit que le champanother
, mais il ne voit pas (ou ne se soucie pas du champsome
). Si vous aviezid
dans le modèle de niveau supérieur, et répétez àid
nouveau dans childContext, cela fonctionnera très bien car le partiel ne voit que ce qu'il y a à l'intérieurchildContext
.la source
Oui, j'étais en retard, mais je peux ajouter pour les utilisateurs d' Assemble : vous pouvez utiliser l'
"parseJSON"
assistant intégré http://assemble.io/helpers/helpers-data.html . (Découvert sur https://github.com/assemble/assemble/issues/416 ).la source
Je ne sais pas si cela est utile, mais voici un exemple de modèle Handlebars avec des paramètres dynamiques passés à un partiel RadioButtons en ligne et le client (navigateur) rendant les boutons radio dans le conteneur.
Pour mon utilisation, il est rendu avec Handlebars sur le serveur et permet au client de le terminer. Avec lui, un outil de formulaires peut fournir des données en ligne dans Handlebars sans aide.
Remarque: cet exemple nécessite jQuery
la source