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.

19voto

devongovett Punkte 4725

Ein Problem bei allen hier geposteten Antworten ist, dass sie nicht mit gebundenen Eigenschaften funktionieren, d.h. die Bedingung wird nicht neu ausgewertet, wenn sich die beteiligten Eigenschaften ändern. Hier ist eine etwas fortgeschrittenere Version des Helpers, die Bindungen unterstützt. Sie verwendet die bind Funktion aus der Ember-Quelle, die auch verwendet wird, um den normalen Ember #if Helper zu implementieren.

Dieser ist auf eine einzelne gebundene Eigenschaft auf der linken Seite beschränkt, die mit einem Konstanten auf der rechten Seite verglichen wird, was meiner Meinung nach für die meisten praktischen Zwecke ausreicht. Wenn Sie etwas Fortgeschritteneres als einen einfachen Vergleich benötigen, dann wäre es vielleicht gut, damit zu beginnen, einige berechnete Eigenschaften zu deklarieren und stattdessen den normalen #if Helper zu verwenden.

Ember.Handlebars.registerHelper('ifeq', function(a, b, options) {
  return Ember.Handlebars.bind.call(options.contexts[0], a, options, true, function(result) {
    return result === b;
  });
});

Sie können es so verwenden:

{{#ifeq obj.some.property "something"}}
  Sie sind gleich!
{{/ifeq}}

0 Stimmen

Das ist die richtige Antwort, wenn Sie Ember verwenden. Die anderen Lösungen, wie Sie erwähnt haben, übergeben nur den Schlüssel anstelle des Werts. Übrigens danke dafür, habe einige Stunden damit verbracht, mir den Kopf zu zerbrechen.

2 Stimmen

Hat jemand das mit HTMLBars/Ember 1.10 zum Laufen gebracht? Ember.Handlebars.bind scheint nicht mehr zu existieren.

0 Stimmen

Ich habe ursprünglich `registerBoundHelper` verwendet, aber dann hat es sich geändert und konnte nicht zum else-Wert und zurück wechseln. Diese Methode funktioniert mit Ember zum Ändern :) Sie sollte mehr Stimmen bekommen.

12voto

Hier ist eine Lösung, wenn Sie mehrere Bedingungen überprüfen möchten:

/* Handler zum Überprüfen mehrerer Bedingungen
   */
  Handlebars.registerHelper('checkIf', function (v1,o1,v2,mainOperator,v3,o2,v4,options) {
      var operators = {
           '==': function(a, b){ return a==b},
           '===': function(a, b){ return a===b},
           '!=': function(a, b){ return a!=b},
           '!==': function(a, b){ return a!==b},
           '<': function(a, b){ return a': function(a, b){ return a>b},
           '>=': function(a, b){ return a>=b},
           '&&': function(a, b){ return a&&b},
           '||': function(a, b){ return a||b},
        }
      var a1 = operators[o1](v1,v2);
      var a2 = operators[o2](v3,v4);
      var isTrue = operators[mainOperator](a1, a2);
      return isTrue ? options.fn(this) : options.inverse(this);
  });

Verwendung:

/* if(list.length>0 && public){}*/

{{#checkIf list.length '>' 0 '&&' public '==' true}} Bedingung erfüllt{{/checkIf}}

0 Stimmen

Liebe die Einfachheit davon. Danke!

12voto

Vincent Punkte 890

Verbesserte Lösung, die grundsätzlich mit jedem binären Operator funktioniert (zumindest Zahlen, Strings funktionieren nicht gut mit eval, VORSICHT BEI MÖGLICHER SKRIPTINJEKTION BEI VERWENDUNG EINES NICHT DEFINIERTEN OPERATORS MIT BENUTZEREINGABEN):

Handlebars.registerHelper("ifCond",function(v1,operator,v2,options) {
    switch (operator)
    {
        case "==":
            return (v1==v2)?options.fn(this):options.inverse(this);

        case "!=":
            return (v1!=v2)?options.fn(this):options.inverse(this);

        case "===":
            return (v1===v2)?options.fn(this):options.inverse(this);

        case "!==":
            return (v1!==v2)?options.fn(this):options.inverse(this);

        case "&&":
            return (v1&&v2)?options.fn(this):options.inverse(this);

        case "||":
            return (v1||v2)?options.fn(this):options.inverse(this);

        case "<":
            return (v1":
            return (v1>v2)?options.fn(this):options.inverse(this);

        case ">=":
         return (v1>=v2)?options.fn(this):options.inverse(this);

        default:
            return eval(""+v1+operator+v2)?options.fn(this):options.inverse(this);
    }
});

0 Stimmen

Wie würden Sie dies in einer Vorlage verwenden? Vor allem der Teil mit options.fn?

0 Stimmen

{{ifCond val1 '||' val2}}true{{else}}false{{/if}} gibt options.fn (wahr, die ifCond-Klausel) zurück, wenn sie korrekt ist. Andernfalls gibt es options.inverse (falsch, die else-Klausel) zurück, wenn sie falsch ist.

2 Stimmen

Aufgrund des genannten Hinweises bezüglich Skriptinjektion würde ich dringend davon abraten, diesen Helfer zu verwenden. In einem großen Codebestand könnte dies leicht für ein böses Sicherheitsproblem auf lange Sicht verantwortlich sein.

7voto

CleanTheRuck Punkte 651

Hier ist ein Link zum Block-Helper, den ich benutze: Vergleichsblock-Helper. Er unterstützt alle Standardoperatoren und ermöglicht es Ihnen, Code wie unten gezeigt zu schreiben. Es ist wirklich ziemlich praktisch.

{{#compare Database.Tables.Count ">" 5}}
Es gibt mehr als 5 Tabellen
{{/compare}}

1 Stimmen

Dies sollte die Siegreiche stimme sein. Nicht verfälscht und beabsichtigt. Ich finde fast jedes Mal, dass wenn Sie einen neuen Helfer schreiben, überlegen Sie es sich zu sehr.

2 Stimmen

@augurone dies ist kein nativer Helfer. Wenn Sie dem Link folgen, werden Sie sehen, dass es sich um einen benutzerdefinierten Helfer handelt.

0 Stimmen

@gfullam du hast recht, ich habe Handlebars in Assemble verwendet, das diesen Helper standardmäßig enthält. Mein Fehler.

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.

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