检查一个等于Ember Handlebar中的值如果是帮助者
我们如何检查ember.js的If-block助手中的值相等性?
{{#if person=="John"}}
我们如何在车把上方执行?
{{#if}}
助手只能testing属性,而不是任意的expression式。 因此,在这种情况下做最好的事情是编写一个属性计算任何条件你想testing。
personIsJohn: function() { return this.get('person') === 'John'; }.property('person')
然后做{{#if personIsJohn}}
。
注意:如果你觉得这个限制太大,你也可以注册你自己更强大的助手 。
使用Ember.Component
,从而避免在类中重复定义计算属性(如上面的personIsJohn
):
// if_equal_component.js script App.IfEqualComponent = Ember.Component.extend({ isEqual: function() { return this.get('param1') === this.get('param2'); }.property('param1', 'param2') }); // if-equal.handlebars template {{#if isEqual}} {{yield}} {{/if}}
您可以使用App.ElseEqualComponent
定义比较的其他部分:
// else_equal_component.js script App.ElseEqualComponent = App.IfEqualComponent.extend(); // else-equal.handlebars template {{#unless isEqual}} {{yield}} {{/unless}}
用法:
{{#if-equal param1=person param2="John"}} Hi John! {{/if-equal}} {{#else-equal param1=person param2="John"}} Who are you? {{/else-equal}}
如果您使用的是HTMLBars(Ember版本为1.10+),那么您可以使用Ember Truth Helper插件:
https://github.com/jmurphyau/ember-truth-helpers
一旦安装,它将如此简单:
{{#if (eq person "John")}} hello {{/if}}
虽然这个问题可以通过编写eq帮手来解决
{{#if (eq person "John")}} hello {{/if}}
但是对于一个通用的解决scheme,你可以使自己的帮手,这将需要三个参数param[0]
和param[2]
是操作数和param[1]
是运算符。 以下是帮手文件。
compare.js
import Ember from 'ember'; export function compare(params) { if(params[3]){ //handle case insensitive conditions if 4 param is passed. params[0]= params[0].toLowerCase(); params[2]= params[2].toLowerCase(); } let v1 = params[0]; let operator = params[1]; let v2 = params[2]; switch (operator) { case '==': return (v1 == v2); case '!=': return (v1 != v2); case '===': return (v1 === v2); case '<': return (v1 < v2); case '<=': return (v1 <= v2); case '>': return (v1 > v2); case '>=': return (v1 >= v2); case '&&': return !!(v1 && v2); case '||': return !!(v1 || v2); default: return false; } } export default Ember.Helper.helper(compare);
现在您可以轻松地将其用于多种用途。
为平等检查。
{{#if (compare person '===' 'John')}} {{/if}}
为更大的检查。
{{#if (compare money '>' 300)}} {{/if}}
等等。
扩展Jo Liss的答案,现在可以使用计算属性macros来执行此操作,以获得更简洁和可读的代码。
personIsJohn: function() { return this.get('person') === 'John'; }.property('person')
变
personIsJohn: Ember.computed.equal('person', 'John')
Relavent Docs 。