尽管JMustache是一个无逻辑模板框架,但我想知道是否可以在视图中使用一些基本表达式。例如,如果我想突出显示任务具有高优先级的行,使用JSP模板我可以使用表达式语言(EL)来比较优先级:
<c:if test="${task.priority == Priority.HIGH}">
<b>
<c:out value="${task.priority}" />
</b>
</c:if>
但是,使用JMustache获得相同的结果,我必须预先计算Controller层中的布尔值,因为您可以看到here和here。之后,我可以用这种方式检查Mustache模板中的布尔值:
{{#highPriority}}
<td><b>{{task.priority}}</b></td>
{{/highPriority}}
我的问题是,我可以像在JSP中那样与Mustache进行比较吗?例如,
{{#task.priority == Priority.HIGH}}
<td><b>{{task.priority}}</b></td>
{{/highPriority}}
如果没有,Handlebars template框架是否提供了它?
答案 0 :(得分:1)
这两个模板引擎都是无逻辑的,所以你不能开箱即用。
但是,您可以注册帮助程序并实现自己的逻辑版本。在https://gist.github.com/doginthehat/1890659处有一个示例实现。根据SO标准,我在此复制,但希望将doginthehat
用于工作:
Handlebars.registerHelper('compare', function(lvalue, rvalue, options) {
if (arguments.length < 3)
throw new Error("Handlerbars Helper 'compare' needs 2 parameters");
var operator = options.hash.operator || "==";
var operators = {
'==': function(l,r) { return l == r; },
'===': function(l,r) { return l === r; },
'!=': function(l,r) { return l != r; },
'<': function(l,r) { return l < r; },
'>': function(l,r) { return l > r; },
'<=': function(l,r) { return l <= r; },
'>=': function(l,r) { return l >= r; },
'typeof': function(l,r) { return typeof l == r; }
}
if (!operators[operator])
throw new Error("Handlerbars Helper 'compare' doesn't know the operator "+operator);
var result = operators[operator](lvalue,rvalue);
if( result ) {
return options.fn(this);
} else {
return options.inverse(this);
}
});
您的用例如下:
{{#compare task.priority Priority.HIGH operator="==="}}
<td><b>{{task.priority}}</b></td>
{{/compare}}