2013-02-12 4 views
5

È possibile eseguire la logica booleana all'interno di un manubrio condizionale?Logica booleana all'interno di un modello di manubri

In questo momento mi spoof questo comportamento con una funzione di controllo, così finisco con il controller

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

che mi permette di utilizzare un modello manubrio di

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

e che funziona bene, ma solleva alcuni problemi. Prima di tutto, oscura ciò che accade (in particolare se non vengono utilizzati i nomi delle funzioni corrette). In secondo luogo, sembra violare un po 'la separazione MVC.

E 'possibile fare qualcosa sulla falsariga di

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

e farlo funzionare?

+0

vedi correlati: http://stackoverflow.com/questions/14149415/double-condition-with-if – CraigTeegarden

risposta

7

Non è possibile farlo direttamente ma non è così difficile da fare con un po 'di parsing arguments e un assistente variadic. Qualcosa di simile a questo:

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); 
}); 

E poi in un modello che si può dire:

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

è possibile utilizzare come molti argomenti per {{#if_all}} di cui hai bisogno. Si potrebbe desiderare di regolare la prova truthiness per abbinare Handlebars dal {{#if}} tratta

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

come Falsey e tutto il resto come truthy mentre [] è truthy in JavaScript.

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

9

può essere si può provare questo manubri aiutante:

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); 
} 

});

e richiamare in questo modo:

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