Javascript 把手模板中的布尔逻辑
是否可以在把手条件中执行布尔逻辑 现在我用一个控制器函数来欺骗这个行为,所以我最终得到了控制器Javascript 把手模板中的布尔逻辑,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,是否可以在把手条件中执行布尔逻辑 现在我用一个控制器函数来欺骗这个行为,所以我最终得到了控制器 App.ApplicationController=Ember.Controller.extend({ bool1:是的, bool2:是的, both:function(){返回this.bool1&&this.bool2;}.property('content.both'), }); 这让我可以使用 {{{#如果两者都有} 两者都是真的 {{/if} 这很好,但也带来了一些问题。首先,它掩盖
App.ApplicationController=Ember.Controller.extend({
bool1:是的,
bool2:是的,
both:function(){返回this.bool1&&this.bool2;}.property('content.both'),
});
这让我可以使用
{{{#如果两者都有}
两者都是真的
{{/if}
这很好,但也带来了一些问题。首先,它掩盖了正在发生的事情(特别是如果没有使用好的函数名)。其次,它似乎有点侵犯了MVC的分离
有没有可能按照这条路线做点什么
{{{如果bool1&&bool2}
两者都是真的
{{/if}
然后让它工作起来?你不能直接做,但用一点解析和一个变量助手也不难。大概是这样的:
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}}
使用任意多的参数。您可能需要调整真实性测试以匹配把手
在JavaScript中,[]
是真实的
演示:可能是您可以尝试此把手助手:
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);
}
handlebar.registerHelper('ifCond',函数(v1,运算符,v2,选项){
开关(操作员){
案例“==”:
返回(v1==v2)?options.fn(this):options.inverse(this);
案例“=”:
返回(v1==v2)?options.fn(this):options.inverse(this);
案例“=”:
返回(v1>=v2)?options.fn(this):options.inverse(this);
案例“&&”:
return(v1&&v2)?options.fn(this):options.inverse(this);
案例“| |”:
return(v1 | | v2)?options.fn(this):options.inverse(this);
违约:
返回选项。反向(此);
}
}))
然后像这样调用它:
{{#ifCond showDistance "&&" distance}}
<span class="distance">
{{distance}}
</span>
{{else}}
{{#if showRegion}}
<span class="region">
</span>
{{/if}}
{{/ifCond}}
{{distance}}
{{else}
{{#if showRegion}
{{/if}
{{/ifCond}
请参见相关内容:
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}}