2013-02-12 64 views
5

有可能在把手条件内执行布尔逻辑吗?把手模板内的布尔逻辑

现在我欺骗与控制器功能的这种行为,所以我最终与控制器

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

,让我使用的

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

一个车把模板和工作正常,但会产生一些问题。首先,它掩盖了发生的事情(特别是如果没有使用好的函数名称)。其次,它似乎侵犯了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 2013-02-12 19:02:19

回答

7

你不能直接做它,但它不是很难用一点点解析和一个可变助手。事情是这样的:

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}}。您可能要调整感实性测试匹配的手把因为{{#if}}对待

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

为falsey和一切为truthy而[]是在JavaScript truthy。

演示: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}}