JMustache 中的条件表达式
Conditional expressions in JMustache
尽管JMustache是一个无逻辑模板框架,但我想知道是否可以在视图中使用一些基本表达式。例如,如果我想突出显示任务优先级高的行,使用 JSP 模板,我可以使用表达式语言 (EL) 比较优先级:
<c:if test="${task.priority == Priority.HIGH}">
<b>
<c:out value="${task.priority}" />
</b>
</c:if>
但是,如果要使用 JMustache 获得相同的结果,我必须预先计算控制器层中的布尔值,如您所见 here and 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 框架是否提供?
这两个模板引擎都是 logic-less,因此您无法进行开箱即用的比较。
但是,您可以注册助手并实现您自己的逻辑版本。 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}}
尽管JMustache是一个无逻辑模板框架,但我想知道是否可以在视图中使用一些基本表达式。例如,如果我想突出显示任务优先级高的行,使用 JSP 模板,我可以使用表达式语言 (EL) 比较优先级:
<c:if test="${task.priority == Priority.HIGH}">
<b>
<c:out value="${task.priority}" />
</b>
</c:if>
但是,如果要使用 JMustache 获得相同的结果,我必须预先计算控制器层中的布尔值,如您所见 here and 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 框架是否提供?
这两个模板引擎都是 logic-less,因此您无法进行开箱即用的比较。
但是,您可以注册助手并实现您自己的逻辑版本。 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}}