555 Stimmen

Logischer Operator in einer Handlebars.js {{#if}} Bedingung

Gibt es eine Möglichkeit, in Handlebars JS logische Operatoren in den Standard-Handlebars.js-Bedingungsoperator einzubinden? Etwas wie das:

{{#if section1 || section2}}
.. Inhalt
{{/if}}

Ich weiß, ich könnte meinen eigenen Helfer schreiben, aber ich möchte zuerst sicherstellen, dass ich nicht das Rad neu erfinde.

1 Stimmen

Für die "und" Logik können Sie verschachtelte if-Bedingungen verwenden, aber es ist umständlich und hilft Ihnen nicht beim "sonst", oder bei einer "oder" Logik wie in Ihrer obigen Frage.

5voto

Ember Freak Punkte 12838

Install Ember Truth Helpers Add-On, indem du den folgenden Befehl ausführst

ember install ember-truth-helpers

Du kannst die meisten logischen Operatoren (eq, not-eq, not, and, or, gt, gte, lt, lte, xor) verwenden.

{{#if (or section1 section2)}}  
...Inhalt  
{{/if}}

Du kannst sogar Unterausdrücke verwenden, um weiterzugehen,

{{#if (or (eq section1 "section1") (eq section2 "section2")) }}  
...Inhalt  
{{/if}}

0 Stimmen

Vielen Dank fürs Teilen, diese einfache Lösung hat perfekt funktioniert.

1 Stimmen

Sieht so aus, als ob das ohne ember-truth-helpers funktioniert. Oder etwas Ähnliches, das in Handlebars eingebettet ist. Überprüft im Jahr 2022.

0 Stimmen

Ja. Danke für die Information. Es scheint, dass in diesem RFC diskutiert und allmählich umgesetzt wurde.

4voto

ars265 Punkte 1879

Ähnlich wie Jims Antwort, aber unter Verwendung einer kleinen Kreativität könnten wir auch so etwas tun:

Handlebars.registerHelper( "compare", function( v1, op, v2, options ) {

  var c = {
    "eq": function( v1, v2 ) {
      return v1 == v2;
    },
    "neq": function( v1, v2 ) {
      return v1 != v2;
    },
    ...
  }

  if( Object.prototype.hasOwnProperty.call( c, op ) ) {
    return c[ op ].call( this, v1, v2 ) ? options.fn( this ) : options.inverse( this );
  }
  return options.inverse( this );
} );

Dann verwenden wir es ungefähr so:

{{#compare numberone "eq" numbertwo}}
  etwas tun
{{else}}
  etwas anderes tun
{{/compare}}

Ich würde vorschlagen, das Objekt aus der Funktion herauszunehmen, um die Leistung zu verbessern, aber ansonsten können Sie jede Vergleichsfunktion hinzufügen, die Sie möchten, einschließlich "und" und "oder".

3voto

Programmer Dan Punkte 269

Ich kann verstehen, warum Sie einen Helfer für Situationen erstellen möchten, in denen Sie eine große Anzahl von verschiedenen Vergleichen innerhalb Ihres Templates durchführen müssen, aber für eine relativ kleine Anzahl von Vergleichen (oder auch nur einen, was mich überhaupt auf diese Seite gebracht hat), wäre es wahrscheinlich einfacher, einfach eine neue Handlebars-Variable in Ihrem View-Rendering-Funktionsaufruf zu definieren, wie:

An Handlebars beim Rendern übergeben:

var context= {
    'section1' : section1,
    'section2' : section2,
    'section1or2' : (section1)||(section2)
};

und dann innerhalb Ihres Handlebars-Templates:

{{#if section1or2}}
    .. Inhalt
{{/if}}

Ich erwähne dies der Einfachheit halber und auch, weil es eine schnelle und hilfreiche Antwort sein kann, die den logiklosen Charakter von Handlebars dennoch einhält.

3voto

Pawel Punkte 12592

Leider lösen keine dieser Lösungen das Problem des "ODER"-Operators "cond1 || cond2".

  1. Überprüfen Sie, ob der erste Wert wahr ist
  2. Verwenden Sie "^" (oder) und überprüfen Sie, ob andernfalls cond2 wahr ist

    {{#if cond1}} DIE AKTION AUSFÜHREN {{^}} {{#if cond2}} DIE AKTION AUSFÜHREN {{/if}} {{/if}}

Es verstößt gegen die DRY-Regel. Warum also nicht einen Teil verwenden, um es weniger unordentlich zu machen

{{#if cond1}}
    {{> subTemplate}}
{{^}}
    {{#if cond2}}
        {{> subTemplate}}
    {{/if}}
{{/if}}

3voto

Shital Shah Punkte 54846

Eine andere Alternative ist, den Funktionsnamen im #if zu verwenden. Das #if wird feststellen, ob der Parameter eine Funktion ist, und wenn ja, wird es sie aufrufen und ihr Rückgabewert für die Wahrheitsüberprüfung verwenden. Unten erhält myFunction den aktuellen Kontext als this.

{{#if myFunction}}
  Ich bin glücklich!
{{/if}}

0 Stimmen

So müssen Sie eine Funktion in den Kontext einfügen? Das Ausführen von Code aus einem Kontext ist ein Sicherheitsloch, da die Quelle des Codes unbekannt sein könnte. Dies kann für einen XSS-Angriff ausgenutzt werden.

0 Stimmen

Ja, du musst die Funktion in den Kontext einfügen. In einer schlecht gestalteten Website könnte dies ein Sicherheitsloch sein. Aber in diesem Fall gäbe es viele andere.

0 Stimmen

Dies ist der bevorzugte Weg.. Danke.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X