1

我在解析为模板时遇到了一些 JSON 问题。本质上,我正在通过一个简单的 Web 界面构建查询,以 JSON 格式提取数据,并使用 Mustache 控制数据/模板。

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

是否可以使用通配符在车把块助手中运行like或样式比较?indexof

IE

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

感谢任何帮助,谢谢

4

2 回答 2

4

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

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

模板应如下所示(表达式块助手

{{#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);
            }
        },

        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);
于 2019-01-09T02:49:25.893 回答
1

您确实可以这样做,但您需要创建一个自定义Handlebars 助手

您的模板最终会看起来像

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

#like您的自定义助手的名称在哪里。

于 2013-06-26T19:11:05.747 回答