2013-02-12 14 views
5

ハンドルバーの条件内でブール論理を実行することは可能ですか?ハンドルバーテンプレート内の論理論理

今、私はコントローラ機能でこの動作を偽装ので、私は私が

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

のハンドルバーのテンプレートを使用することができますし、それが正常に動作コントローラ

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

で終わりますいくつかの問題を引き起こす。まず、何が起こっているのかを隠します(特に良い関数名が使用されていない場合)。第二に、それはMVC分離のビットを侵害するようです。

はそれが

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

の線に沿って何かをすると、それが動作していることは可能ですか?

+0

関連参照:http://stackoverflow.com/questions/14149415/double-condition-with-if – CraigTeegarden

答えて

7

あなたはそれを直接行うことはできませんが、少しだけargumentsの解析とvariadicヘルパーで行うのは難しくありません。このような何か:

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

そして、あなたが言うことができるテンプレートに:あなたが必要として

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

あなたは{{#if_all}}にできるだけ多くの引数を使用することができます。あなたは[]はJavaScriptでtruthyあるのに対しfalseyとtruthyなど他のすべてとして{{#if}}扱い

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

ので、ハンドルバーに一致するようにtruthinessテストを調整したい場合があります。

デモ:http://jsfiddle.net/ambiguous/vrb2h/

9

は、あなたがこのヘルパーハンドル試みることができることがあります

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

});

とこのようにそれを呼び出す:

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