{{#if}}
助手只能测试属性,而不是任意表达式。在这种情况下最好的做法是编写一个计算你想要测试的任何条件的属性。
personIsJohn: function() {
return this.get('person') === 'John';
}.property('person')
那么就执行 {{#if personIsJohn}}
。
注意:如果你觉得这太过限制,你也可以注册自己更强大的if
助手。
personIsJohn
,personIsMike
,...或者注册一个新的类似于 if
的帮助程序 - 请参见我上面的编辑。 - Jo LissEmber.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 部分:
// 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}}
{{#if (eq person "John")}} hello {{/if}}
尽管可以通过编写eq助手来解决这个问题
{{#if (eq person "John")}} hello {{/if}}
但是要想获得通用解决方案,您可以创建自己的帮助程序,它将需要三个参数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的回答基础上,你现在可以使用计算属性宏来实现更加简洁和易读的代码。
personIsJohn: function() {
return this.get('person') === 'John';
}.property('person')
变成
personIsJohn: Ember.computed.equal('person', 'John')
相关文档。