Existe-t-il un moyen dans le guidon JS d'incorporer des opérateurs logiques dans l'opérateur conditionnel standard guidbars.js? Quelque chose comme ça:
{{#if section1 || section2}}
.. content
{{/if}}
Je sais que je pourrais écrire mon propre assistant, mais je voudrais d'abord m'assurer que je ne réinvente pas la roue.
javascript
handlebars.js
Mike Robinson
la source
la source
registerBoundHelper
ne peut pas gérer la syntaxe des guidons. La solution consiste à créer une vue personnalisée: stackoverflow.com/questions/18005111/…Aller plus loin dans la solution. Cela ajoute l'opérateur de comparaison.
Utilisez-le dans un modèle comme celui-ci:
Version Coffee Script
la source
'||'
et'&&'
. J'ai ajouté ces cas et ils sont très utiles.v1 = Ember.Handlebars.get(this, v1, options)
v2 = Ember.Handlebars.get(this, v2, options)
Le guidon prend en charge les opérations imbriquées. Cela offre beaucoup de flexibilité (et un code plus propre) si nous écrivons notre logique un peu différemment.
En fait, nous pouvons ajouter toutes sortes de logiques:
Enregistrez simplement ces aides:
la source
options
exécution, il est préférable de conserver laif
méthode et plus facile à tester. Merci!and
et vousor
ne travaillez qu'avec 2 paramètres, ce qui n'est pas ce que vous voulez. J'ai réussi à retravailler les assistantsand
etor
pour prendre en charge plus de deux paramètres. Utilisez ce one-liner pourand
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).every(Boolean);
et utiliser une doublure pouror
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).some(Boolean);
.prendre celui-ci un cran, pour ceux d'entre vous qui vivent sur le bord.
gist : https://gist.github.com/akhoury/9118682 Démo : extrait de code ci-dessous
Aide au guidon:
{{#xif EXPRESSION}} {{else}} {{/xif}}
un assistant pour exécuter une instruction IF avec n'importe quelle expression
encodeURIComponent(property)
template( {name: 'Sam', age: '20' } )
, l'avisage
est unstring
, juste pour que je puisse faire une démonstrationparseInt()
plus tard dans ce postUsage:
Production
JavaScript: (cela dépend d'un autre assistant - continuez à lire)
Aide au guidon:
{{x EXPRESSION}}
Un assistant pour exécuter des expressions javascript
parseInt(property)
template( {name: 'Sam', age: '20' } )
,age
eststring
à des fins de démonstration, il peut être n'importe quoi.Usage:
Production:
JavaScript:
Cela semble un peu grand car j'ai développé la syntaxe et commenté presque chaque ligne à des fins de clarté
Moar
si vous voulez accéder à la portée de niveau supérieur, celle-ci est légèrement différente, l'expression est le JOIN de tous les arguments, utilisation: disons que les données de contexte ressemblent à ceci:
Javascript:
la source
{{#each}} ... {{xif ' ../name === this.name' }} {{/each}}
... mais{{z ...}}
helpereval(expression);
par ceci:eval('(function(){try{return ' + expression + ';}catch(e){}})();');
- Je sais que cela devient moche, mais je ne peux pas penser à un moyen sûr de le faire - veuillez noter que ce n'est pas très "rapide" à exécuter, je ne le ferais pas dans énorme itération.Il existe un moyen simple de le faire sans écrire une fonction d'aide ... Cela peut être fait complètement dans le modèle.
Modifier: Inversement, vous pouvez faire ou faire en faisant ceci:
Edit / Note: Sur le site Web du guidon: handlebarsjs.com voici les valeurs de falsification:
la source
Un problème avec toutes les réponses publiées ici est qu'elles ne fonctionnent pas avec les propriétés liées, c'est-à-dire que la condition if n'est pas réévaluée lorsque les propriétés impliquées changent. Voici une version légèrement plus avancée de l'aide qui prend en charge les liaisons. Il utilise la fonction de liaison de la source Ember, qui est également utilisée pour implémenter l'
#if
aide Ember normale .Celui-ci est limité à une propriété liée unique sur le côté gauche, par rapport à une constante sur le côté droit, qui je pense est assez bon pour la plupart des fins pratiques. Si vous avez besoin de quelque chose de plus avancé qu'une simple comparaison, alors il serait peut-être bon de commencer à déclarer certaines propriétés calculées et d'utiliser à la
#if
place l'aide normale .Vous pouvez l'utiliser comme ceci:
la source
Solution améliorée qui fonctionne essentiellement avec n'importe quel opérateur binaire (au moins les nombres, les chaînes ne fonctionnent pas bien avec eval, PRENEZ SOIN DE L'INJECTION POSSIBLE DU SCRIPT SI VOUS UTILISEZ UN OPÉRATEUR NON DÉFINI AVEC DES ENTRÉES UTILISATEUR):
la source
Voici une solution si vous souhaitez vérifier plusieurs conditions:
Usage:
la source
Voici un lien vers l'assistant de bloc que j'utilise: l' assistant de bloc de comparaison . Il prend en charge tous les opérateurs standard et vous permet d'écrire du code comme indiqué ci-dessous. C'est vraiment très pratique.
la source
Semblable à la réponse de Jim, mais en utilisant un peu de créativité, nous pourrions également faire quelque chose comme ceci:
Ensuite, pour l'utiliser, nous obtenons quelque chose comme:
Je suggérerais de déplacer l'objet hors de la fonction pour de meilleures performances, mais sinon vous pouvez ajouter n'importe quelle fonction de comparaison que vous souhaitez, y compris "et" et "ou".
la source
Une autre alternative consiste à utiliser le nom de la fonction dans
#if
. Le#if
détectera si le paramètre est fonctionnel et s'il l'est, il l'appellera et utilisera son retour pour vérifier la véracité. Ci-dessous, myFunction obtient le contexte actuel commethis
.la source
Malheureusement, aucune de ces solutions ne résout le problème de l'opérateur "OU" "cond1 || cond2".
Utilisez "^" (ou) et vérifiez si sinon cond2 est vrai
{{#if cond1}} FAITES L'ACTION {{^}} {{#if cond2}} FAITES L'ACTION {{/ if}} {{/ if}}
Il enfreint la règle DRY. Alors pourquoi ne pas utiliser partiel pour le rendre moins salissant
la source
Je peux comprendre pourquoi vous voudriez créer une aide pour les situations où vous avez un grand nombre de comparaisons variées à effectuer dans votre modèle, mais pour un nombre relativement petit de comparaisons (ou même une, ce qui m'a amené à cette page dans en premier lieu), il serait probablement plus facile de définir une nouvelle variable de guidon dans votre appel de fonction de rendu de vue, comme:
Passer au guidon lors du rendu:
puis dans votre modèle de guidon:
Je mentionne cela pour des raisons de simplicité, et aussi parce que c'est une réponse qui peut être rapide et utile tout en respectant la nature sans logique des guidons.
la source
Installez le module complémentaire Ember Truth Helpers en exécutant la commande ci-dessous
vous pouvez commencer à utiliser la plupart des opérateurs logiques (eq, not-eq, not et and, or, gt, gte, lt, lte, xor).
Vous pouvez même inclure une sous-expression pour aller plus loin,
la source
Encore une autre solution tordue pour un assistant ternaire:
Ou un simple assistant de fusion:
Étant donné que ces caractères n'ont pas de signification particulière dans le balisage du guidon, vous êtes libre de les utiliser pour les noms d'assistance.
la source
J'ai trouvé un paquet npm fait avec CoffeeScript qui a beaucoup d'aides incroyablement utiles pour les guidons. Jetez un œil à la documentation dans l'URL suivante:
https://npmjs.org/package/handlebars-helpers
Vous pouvez faire un
wget http://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.2.6.tgz
pour les télécharger et voir le contenu du package.Vous serez capable de faire des choses comme
{{#is number 5}}
ou{{formatDate date "%m/%d/%Y"}}
la source
si vous voulez simplement vérifier si l'un ou l'autre élément est présent, vous pouvez utiliser cet assistant personnalisé
comme ça
si vous devez également pouvoir avoir un "ou" pour comparer les valeurs de retour de fonction je préfère ajouter une autre propriété qui renvoie le résultat souhaité.
Les modèles devraient être sans logique après tout!
la source
Pour ceux qui ont des problèmes pour comparer les propriétés des objets, à l'intérieur de l'assistant, ajoutez cette solution
Aide Ember.js ne reconnaît pas correctement un paramètre
la source
Je viens de venir à ce poste à partir d'une recherche Google sur la façon de vérifier si une chaîne est égale à une autre chaîne.
J'utilise HandlebarsJS dans NodeJS côté serveur, mais j'utilise également les mêmes fichiers de modèle sur le front-end en utilisant la version navigateur de HandlebarsJS pour l'analyser. Cela signifiait que si je voulais un assistant personnalisé, je devrais le définir à 2 endroits différents, ou affecter une fonction à l'objet en question - trop d'effort !!
Ce que les gens oublient, c'est que certains objets ont des fonctions héritées qui peuvent être utilisées dans le modèle de moustache. Dans le cas d'une chaîne:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
An Array containing the entire match result and any parentheses-captured matched results; null if there were no matches.
Nous pouvons utiliser cette méthode pour renvoyer soit un tableau de correspondances, soit
null
si aucune correspondance n'a été trouvée. C'est parfait, car en consultant la documentation HandlebarsJS http://handlebarsjs.com/builtin_helpers.htmlYou can use the if helper to conditionally render a block. If its argument returns false, undefined, null, "", 0, or [], Handlebars will not render the block.
Donc...
MISE À JOUR:
Après avoir testé sur tous les navigateurs, cela ne fonctionne pas sur Firefox . HandlebarsJS transmet d'autres arguments à un appel de fonction, ce qui signifie que lorsque String.prototype.match est appelé, le deuxième argument (c'est-à-dire les indicateurs Regexp pour l'appel de fonction de correspondance selon la documentation ci-dessus) semble être passé. Firefox voit cela comme une utilisation obsolète de String.prototype.match, et se brise donc.
Une solution consiste à déclarer un nouveau prototype fonctionnel pour l'objet String JS et à l'utiliser à la place:
Assurez-vous que ce code JS est inclus avant d'exécuter votre fonction Handlebars.compile (), puis dans votre modèle ...
la source
Ici, nous avons des guidons vanille pour de multiples && et || logiques (et ou):
Vous ne savez pas si c'est "sûr" d'utiliser "et" et "ou" ... peut-être changer pour quelque chose comme "op_and" et "op_or"?
la source
Solution correcte pour AND / OR
Appelez ensuite comme suit
BTW: Notez que la solution donnée ici est incorrecte, il ne soustrait pas le dernier argument qui est le nom de la fonction. https://stackoverflow.com/a/31632215/1005607
Son ET / OR original était basé sur la liste complète des arguments
Quelqu'un peut-il changer cette réponse? Je viens de perdre une heure à essayer de corriger quelque chose dans une réponse recommandée par 86 personnes. Le correctif consiste à filtrer le dernier argument qui est le nom de la fonction.
Array.prototype.slice.call(arguments, 0, arguments.length - 1)
la source
En suivant ces 2 guides sur la façon de laisser les utilisateurs définir des instructions if-bound-made- custom et des aides liées personnalisées, j'ai pu ajuster mes vues partagées dans ce post sur stackoverflow pour l'utiliser au lieu du standard # instruction if. Cela devrait être plus sûr que de simplement y jeter un #if.
Les assistants liés personnalisés dans cet esprit sont exceptionnels.
J'utilise le braise cli projet pour créer mon application ember.
Configuration actuelle au moment de cette publication:
la source
Dans Ember.js, vous pouvez utiliser inline if helper dans if block helper. Il peut remplacer
||
l'opérateur logique, par exemple:la source
Vous pouvez le faire simplement en utilisant l'opérateur logique comme celui ci-dessous:
Avant de fermer si vous pouvez écrire votre logique métier
la source
Vous pouvez utiliser le code suivant:
la source
Voici une approche que j'utilise pour ember 1.10 et ember-cli 2.0.
Ensuite, vous pouvez l'utiliser dans vos modèles comme ceci:
Lorsque les arguments à l'expression sont passés en tant que
p0
,p1
,p2
etc. etp0
peuvent également être référencés commethis
.la source