JMustache中的条件表达式

时间:2017-02-07 22:20:25

标签: java mustache

尽管JMustache是一个无逻辑模板框架,但我想知道是否可以在视图中使用一些基本表达式。例如,如果我想突出显示任务具有高优先级的行,使用JSP模板我可以使用表达式语言(EL)来比较优先级:

<c:if test="${task.priority == Priority.HIGH}">
    <b>
        <c:out value="${task.priority}" />
    </b>
</c:if>

但是,使用JMustache获得相同的结果,我必须预先计算Controller层中的布尔值,因为您可以看到herehere。之后,我可以用这种方式检查Mustache模板中的布尔值:

{{#highPriority}}
    <td><b>{{task.priority}}</b></td>
{{/highPriority}}

我的问题是,我可以像在JSP中那样与Mustache进行比较吗?例如,

{{#task.priority == Priority.HIGH}}
    <td><b>{{task.priority}}</b></td>
{{/highPriority}}

如果没有,Handlebars template框架是否提供了它?

1 个答案:

答案 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}}