Gibt es in Lenker JS eine Möglichkeit, logische Operatoren in den bedingten Operator standard handlebars.js zu integrieren? Etwas wie das:
{{#if section1 || section2}}
.. content
{{/if}}
Ich weiß, dass ich meinen eigenen Helfer schreiben könnte, aber zuerst möchte ich sicherstellen, dass ich das Rad nicht neu erfinde.
javascript
handlebars.js
Mike Robinson
quelle
quelle
registerBoundHelper
kann nicht mit der Handlebars-Syntax umgehen. Die Problemumgehung besteht darin, eine benutzerdefinierte Ansicht zu erstellen: stackoverflow.com/questions/18005111/…Die Lösung noch einen Schritt weiter gehen. Dies fügt den Vergleichsoperator hinzu.
Verwenden Sie es in einer Vorlage wie dieser:
Kaffee-Skript-Version
quelle
'||'
und'&&'
. Ich habe diese Fälle hinzugefügt und sie sind sehr nützlich.v1 = Ember.Handlebars.get(this, v1, options)
v2 = Ember.Handlebars.get(this, v2, options)
Der Lenker unterstützt verschachtelte Vorgänge. Dies bietet viel Flexibilität (und saubereren Code), wenn wir unsere Logik etwas anders schreiben.
In der Tat können wir alle Arten von Logik hinzufügen:
Registrieren Sie einfach diese Helfer:
quelle
options
ist es besser , ohne Ausführung dieif
Methode beizubehalten und einfacher zu testen. Vielen Dank!and
undor
Helfer arbeiten nur mit 2 Parametern, was nicht das ist, was Sie wollen. Ich habe es geschafft, sowohl dieand
als auch dieor
Helfer zu überarbeiten , um mehr als zwei Parameter zu unterstützen. Verwenden Sie diesen Einzeiler fürand
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).every(Boolean);
und verwenden Sie diesen Einzeiler füror
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).some(Boolean);
.Nehmen Sie dieses eine Stufe höher für diejenigen von Ihnen, die am Rande leben.
Kern : https://gist.github.com/akhoury/9118682 Demo : Code-Snippet unten
Lenker Helfer:
{{#xif EXPRESSION}} {{else}} {{/xif}}
ein Helfer zum Ausführen einer IF-Anweisung mit einem beliebigen Ausdruck
encodeURIComponent(property)
template( {name: 'Sam', age: '20' } )
, Ankündigungage
ist einstring
, für nur so ich Demo kannparseInt()
später in diesem BeitragVerwendungszweck:
Ausgabe
JavaScript: (es hängt von einem anderen Helfer ab - lesen Sie weiter)
Lenker Helfer:
{{x EXPRESSION}}
Ein Helfer zum Ausführen von Javascript-Ausdrücken
parseInt(property)
template( {name: 'Sam', age: '20' } )
, dass Sie diesen Kontext an Ihren Lenker übergeben haben. Diesage
ist einstring
Demo-Zweck. Es kann alles sein.Verwendungszweck:
Ausgabe:
JavaScript:
Dies sieht etwas groß aus, da ich die Syntax erweitert und aus Gründen der Übersichtlichkeit fast jede Zeile kommentiert habe
Moar
Wenn Sie auf den Bereich der oberen Ebene zugreifen möchten, unterscheidet sich dieser geringfügig. Der Ausdruck ist die VERBINDUNG aller Argumente. Verwendung: Sagen Sie, Kontextdaten sehen folgendermaßen aus:
Javascript:
quelle
{{#each}} ... {{xif ' ../name === this.name' }} {{/each}}
Ich habe keinen Weg gefunden, aus dem Ausdruck heraus auf "obere Bereichsebenen" zuzugreifen. Sagen wir, Sie befinden sich in jedem Bereich, ... aber ich untersuche immer noch ...{{z ...}}
Helfereval(expression);
dies durch Folgendes zu ersetzen :eval('(function(){try{return ' + expression + ';}catch(e){}})();');
- Ich weiß, dass dies hässlich wird, kann mir aber keinen sicheren Weg vorstellen , dies zu tun. - Bitte beachten Sie, dass dies nicht sehr "schnell" auszuführen ist. Ich würde dies nicht tun große Iteration.Es gibt eine einfache Möglichkeit, dies zu tun, ohne eine Hilfsfunktion zu schreiben ... Dies kann vollständig innerhalb der Vorlage erfolgen.
Bearbeiten: Umgekehrt können Sie dies tun oder tun:
Bearbeiten / Hinweis: Auf der Website des Lenkers: handlebarsjs.com sind hier die falschen Werte:
quelle
Ein Problem bei allen hier veröffentlichten Antworten besteht darin, dass sie nicht mit gebundenen Eigenschaften funktionieren, dh die if-Bedingung wird nicht neu bewertet, wenn sich die beteiligten Eigenschaften ändern. Hier ist eine etwas fortgeschrittenere Version des Helfers, der Bindungen unterstützt. Es verwendet die Bindefunktion aus der Ember-Quelle, mit der auch der normale Ember-
#if
Helfer implementiert wird .Diese ist auf eine einzelne gebundene Eigenschaft auf der linken Seite beschränkt, verglichen mit einer Konstante auf der rechten Seite, die meiner Meinung nach für die meisten praktischen Zwecke gut genug ist. Wenn Sie etwas Fortgeschritteneres als einen einfachen Vergleich benötigen, ist es vielleicht gut, einige berechnete Eigenschaften zu deklarieren und stattdessen den normalen
#if
Helfer zu verwenden.Sie können es so verwenden:
quelle
Verbesserte Lösung, die grundsätzlich mit jedem Binäroperator funktioniert (zumindest Zahlen, Zeichenfolgen funktionieren mit eval nicht gut. Achten Sie auf eine mögliche SCRIPT-Injektion, wenn Sie einen nicht definierten Operator mit Benutzereingaben verwenden):
quelle
Hier ist eine Lösung, wenn Sie mehrere Bedingungen überprüfen möchten:
Verwendungszweck:
quelle
Hier ist ein Link zu dem Blockhelfer, den ich benutze: Vergleichsblockhelfer . Es unterstützt alle Standardoperatoren und ermöglicht das Schreiben von Code wie unten gezeigt. Es ist wirklich sehr praktisch.
quelle
Ähnlich wie bei Jims Antwort, aber mit ein wenig Kreativität könnten wir auch so etwas tun:
Um es dann zu benutzen, bekommen wir so etwas wie:
Ich würde vorschlagen, das Objekt aus der Funktion zu entfernen, um eine bessere Leistung zu erzielen. Andernfalls können Sie jede gewünschte Vergleichsfunktion hinzufügen, einschließlich "und" und "oder".
quelle
Eine andere Alternative ist die Verwendung des Funktionsnamens in
#if
. Der#if
erkennt, ob der Parameter eine Funktion ist, und wenn dies der Fall ist, ruft er ihn auf und verwendet seine Rückgabe zur Überprüfung der Richtigkeit. Unter myFunction wird der aktuelle Kontext als angezeigtthis
.quelle
Leider löst keine dieser Lösungen das Problem des "ODER" -Operators "cond1 || cond2".
Verwenden Sie "^" (oder) und prüfen Sie, ob ansonsten cond2 wahr ist
{{#if cond1}} TUN SIE DIE AKTION {{^}} {{#if cond2}} TUN SIE DIE AKTION {{/ if}} {{/ if}}
Es verstößt gegen die DRY-Regel. Warum also nicht teilweise verwenden, um es weniger chaotisch zu machen?
quelle
Ich kann verstehen, warum Sie einen Helfer für Situationen erstellen möchten, in denen Sie eine große Anzahl unterschiedlicher Vergleiche innerhalb Ihrer Vorlage durchführen müssen, aber für eine relativ kleine Anzahl von Vergleichen (oder sogar einen, was mich auf diese Seite gebracht hat) Erstens wäre es wahrscheinlich einfacher, eine neue Lenkervariable in Ihrem Funktionsaufruf zum Rendern von Ansichten zu definieren, z.
Beim Rendern an den Lenker übergeben:
und dann in Ihrer Lenkervorlage:
Ich erwähne dies der Einfachheit halber und auch, weil es eine Antwort ist, die schnell und hilfreich sein kann, während die logische Natur von Lenkern eingehalten wird.
quelle
Installieren Sie das Ember Truth Helpers- Addon, indem Sie den folgenden Befehl ausführen
Sie können die meisten logischen Operatoren verwenden (eq, not-eq, not und oder oder gt, gte, lt, lte, xor).
Sie können sogar einen Unterausdruck einfügen, um weiter zu gehen.
quelle
Noch eine krumme Lösung für einen ternären Helfer:
Oder ein einfacher Koaleszenzhelfer:
Da diese Zeichen im Lenker-Markup keine besondere Bedeutung haben, können Sie sie für Hilfsnamen verwenden.
quelle
Ich habe ein mit CoffeeScript erstelltes npm-Paket gefunden, das viele unglaublich nützliche Helfer für Lenker enthält. Schauen Sie sich die Dokumentation unter der folgenden URL an:
https://npmjs.org/package/handlebars-helpers
Sie können eine tun
wget http://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.2.6.tgz
herunterladen und den Inhalt des Pakets anzeigen.Sie werden in der Lage sein, Dinge wie
{{#is number 5}}
oder zu tun{{formatDate date "%m/%d/%Y"}}
quelle
Wenn Sie nur überprüfen möchten, ob das eine oder andere Element vorhanden ist, können Sie diesen benutzerdefinierten Helfer verwenden
so was
wenn Sie auch ein "oder" benötigen, um Funktionsrückgabewerte zu vergleichen möchte ich lieber eine weitere Eigenschaft hinzufügen, die das gewünschte Ergebnis zurückgibt.
Die Vorlagen sollten doch logisch sein!
quelle
Wenn Sie Probleme beim Vergleichen von Objekteigenschaften haben, fügen Sie diese Lösung im Hilfsprogramm hinzu
Der Ember.js-Helfer erkennt einen Parameter nicht richtig
quelle
Ich bin gerade von einer Google-Suche zu diesem Beitrag gekommen, um zu überprüfen, ob eine Zeichenfolge einer anderen Zeichenfolge entspricht.
Ich verwende HandlebarsJS auf der NodeJS-Serverseite, aber ich verwende auch dieselben Vorlagendateien im Front-End, indem ich die Browserversion von HandlebarsJS verwende, um sie zu analysieren. Das bedeutete, wenn ich einen benutzerdefinierten Helfer haben wollte, musste ich ihn an zwei verschiedenen Stellen definieren oder dem betreffenden Objekt eine Funktion zuweisen - zu viel Aufwand !!
Was die Leute vergessen, ist, dass bestimmte Objekte Vererbungsfunktionen haben, die in der Schnurrbartvorlage verwendet werden können. Im Fall einer Zeichenfolge:
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.
Wir können diese Methode verwenden, um entweder ein Array von Übereinstimmungen zurückzugeben oder
null
wenn keine Übereinstimmungen gefunden wurden. Dies ist perfekt, da Sie sich die Dokumentation zu HandlebarsJS unter http://handlebarsjs.com/builtin_helpers.html ansehenYou 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.
Damit...
AKTUALISIEREN:
Nach dem Testen in allen Browsern funktioniert dies unter Firefox nicht . HandlebarsJS übergibt andere Argumente an einen Funktionsaufruf. Wenn also String.prototype.match aufgerufen wird, scheint das zweite Argument (dh die Regexp-Flags für den Aufruf der Übereinstimmungsfunktion gemäß obiger Dokumentation) übergeben zu werden. Firefox sieht dies als veraltete Verwendung von String.prototype.match an und bricht daher ab.
Eine Problemumgehung besteht darin, einen neuen funktionalen Prototyp für das String JS-Objekt zu deklarieren und stattdessen Folgendes zu verwenden:
Stellen Sie sicher, dass dieser JS-Code enthalten ist, bevor Sie die Funktion Handlebars.compile () und dann in Ihrer Vorlage ausführen ...
quelle
Hier haben wir Vanille-Lenker für mehrere logische && und || (und oder):
Nicht so sicher, ob es "sicher" ist, "und" und "oder" zu verwenden ... vielleicht zu etwas wie "op_and" und "op_or" wechseln?
quelle
Richtige Lösung für UND / ODER
Rufen Sie dann wie folgt an
Übrigens: Beachten Sie, dass die hier angegebene Lösung falsch ist. Er subtrahiert nicht das letzte Argument, das der Funktionsname ist. https://stackoverflow.com/a/31632215/1005607
Sein ursprüngliches UND / ODER basierte auf der vollständigen Liste der Argumente
Kann jemand diese Antwort ändern? Ich habe gerade eine Stunde damit verbracht, etwas in einer von 86 Leuten empfohlenen Antwort zu reparieren. Die Lösung besteht darin , das letzte Argument herauszufiltern, bei dem es sich um den Funktionsnamen handelt.
Array.prototype.slice.call(arguments, 0, arguments.length - 1)
quelle
Nach diesen beiden Anleitungen , mit denen Benutzer benutzerdefinierte gebundene if-Anweisungen und benutzerdefinierte gebundene Helfer definieren können, konnte ich meine freigegebenen Ansichten in diesem Beitrag zum Stapelüberlauf anpassen , um diese anstelle des Standard-# zu verwenden if-Anweisung. Dies sollte sicherer sein, als nur ein #if hineinzuwerfen.
Die benutzerdefinierten Helfer in diesem Kern sind hervorragend.
Ich benutze die Glut Cli Projekt, um meine Ember-Anwendung zu erstellen.
Aktuelles Setup zum Zeitpunkt dieses Beitrags:
quelle
In Ember.js können Sie inline if helper in if block helper verwenden. Es kann den
||
logischen Operator ersetzen , zum Beispiel:quelle
Sie können dies einfach tun, indem Sie den folgenden logischen Operator verwenden:
Vor dem Schließen, wenn Sie Ihre Geschäftslogik schreiben können
quelle
Sie können den folgenden Code verwenden:
quelle
Hier ist ein Ansatz, den ich für Ember 1.10 und Ember-Cli 2.0 verwende.
Dann können Sie es in Ihren Vorlagen wie folgt verwenden:
Wo die Argumente für den Ausdruck übergeben werden in wie
p0
,p1
,p2
usw. undp0
kann auch als Bezug genommen werdenthis
.quelle