2013-02-12 17 views
5

Ist es möglich, boolesche Logik innerhalb eines Lenker-Konditionals auszuführen?Boolesche Logik in einer Lenker-Vorlage

Gerade jetzt fälsche ich dieses Verhalten mit einer Controller-Funktion, so dass ich am Ende mit dem Controller

App.ApplicationController = Ember.Controller.extend({ 
    bool1: true, 
    bool2: true, 
    both: function(){ return this.bool1 && this.bool2; }.property('content.both'), 
}); 

Was mir einen Lenker Vorlage von

<script type="text/x-handlebars"> 
    {{#if both}} 
    <p> both were true </p> 
    {{/if}} 
</script> 

und das funktioniert gut nutzen kann, aber wirft einige Probleme auf. Zunächst verdeckt es, was passiert (insbesondere wenn keine guten Funktionsnamen verwendet werden). Zweitens scheint es ein wenig die MVC-Trennung zu verletzen.

Ist es möglich, etwas entlang der Linien von

<script type="text/x-handlebars"> 
    {{#if bool1 && bool2}} <!-- this will not actually work --> 
    <p> both were true </p> 
    {{/if}} 
</script> 

und haben es Arbeit zu tun?

+0

siehe bezogen werden: http://stackoverflow.com/questions/14149415/double-condition-with-if – CraigTeegarden

Antwort

7

Sie können es nicht direkt tun, aber es ist nicht so schwer mit ein wenig von arguments Parsing und einem variadic Helfer zu tun. Etwas wie folgt aus:

Handlebars.registerHelper('if_all', function() { 
    var args = [].slice.apply(arguments); 
    var opts = args.pop(); 

    var fn = opts.fn; 
    for(var i = 0; i < args.length; ++i) { 
     if(args[i]) 
      continue; 
     fn = opts.inverse; 
     break; 
    } 
    return fn(this); 
}); 

Und dann in einer Vorlage können Sie sagen:

{{#if_all a b c}} 
    yes 
{{else}} 
    no 
{{/if_all}} 

Sie können so viele Argumente {{#if_all}} verwenden, wie Sie benötigen. Vielleicht möchten Sie die Truthiness Test einzustellen Lenker

`false`, `undefined`, `null`, `""` or `[]` (a "falsy" value) 

als Falsey seit {{#if}} Leckereien passen und alles andere als truthy während [] in JavaScript truthy ist.

Demo: http://jsfiddle.net/ambiguous/vrb2h/

9

sein kann, können Sie versuchen, diese Lenker Helfer:

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 && v2) ? options.fn(this) : options.inverse(this); 
    case '||': 
     return (v1 || v2) ? options.fn(this) : options.inverse(this); 
    default: 
     return options.inverse(this); 
} 

});

und es wie folgt aufrufen:

{{#ifCond showDistance "&&" distance}} 
     <span class="distance"> 
      {{distance}} 
     </span> 
{{else}} 
     {{#if showRegion}} 
      <span class="region"> 
      </span> 
     {{/if}} 
{{/ifCond}}