把手IF值包含x。*

时间:2013-03-19 11:08:08

标签: conditional wildcard mustache

我遇到一些问题,我正在解析模板。基本上,我是通过一个简单的Web界面构建一个查询,以JSON格式拉回数据,并用Mustache控制数据/模板。

但是,我无法通过URL查询JSON中嵌套对象的值...所以我认为我需要使用Handlebars来处理条件语句。

是否可以使用通配符在手柄块帮助器中运行likeindexof样式比较?

{{#if folderPath == "content/published/.*"}}
 Render content
Else, do nothing

感谢任何帮助, 感谢

2 个答案:

答案 0 :(得分:0)

您确实可以这样做,但您需要创建自定义Handlebars helper

您的模板最终会看起来像

{{#like folderPath '==' 'content/published/.*'}}
  something
{{/like}}

#like是自定义帮助程序的名称。

答案 1 :(得分:0)

我知道我来晚了,但是我偶然发现了这一点,应该有一个答案。 我为此写了一个助手。

Handlebars.registerHelper('contains', function(needle, haystack, options) {
    needle = Handlebars.escapeExpression(needle);
    haystack = Handlebars.escapeExpression(haystack);
    return (haystack.indexOf(needle) > -1) ? options.fn(this) : options.inverse(this);
});

模板应如下所示(ExpressionsBlock Helpers

{{#contains "content/published" folderPath}}
    something
{{/contains}}

仅在找到“内容/已发布”的情况下才返回“内容”。 不需要通配符。

这可以用作使用“ else”的开关盒。我对文档中的这一部分不清楚。对某人有用。

{{#contains "content/published" folderPath}}
    Something
{{else contains "content/something" folderPath}}
    Something else
{{else}}
    Something else v2
{{/contains}}

对于使用express-handlebars的用户,您的实现应如下所示(在RegisterHelpers.js中):

var register = function(Handlebars) {
    var helpers = {
        if_op: (a, op, b, options) =>{
            switch (op) {
                case '!=': return (a != b) ? options.fn(this) : options.inverse(this);
                case '!==': return (a !== b) ? options.fn(this) : options.inverse(this);
                case '>=': return (a >= b) ? options.fn(this) : options.inverse(this);
                case '<=': return (a <= b) ? options.fn(this) : options.inverse(this);
                case '==': return (a == b) ? options.fn(this) : options.inverse(this);
                case '===': return (a === b) ? options.fn(this) : options.inverse(this);
                case '>': return (a > b) ? options.fn(this) : options.inverse(this);
                case '<': return (a < b) ? options.fn(this) : options.inverse(this);
                default: return options.fn(this);
            }
        },


        if_contains: (Needle, Haystack, options) => {
            Needle = Handlebars.escapeExpression(Haystack);
            Haystack = Handlebars.escapeExpression(Haystack);
            return (Haystack.indexOf(Needle) > -1) ? options.fn(this) : options.inverse(this);
        }
    }

    if (Handlebars && typeof Handlebars.registerHelper === "function") {
        for (var prop in helpers) {
            Handlebars.registerHelper(prop, helpers[prop]);
        }
    } else {
        return helpers;
    }
}

module.exports.register = register;
module.exports.helpers = register(null);