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