我遇到一些问题,我正在解析模板。基本上,我是通过一个简单的Web界面构建一个查询,以JSON格式拉回数据,并用Mustache控制数据/模板。
但是,我无法通过URL查询JSON中嵌套对象的值...所以我认为我需要使用Handlebars来处理条件语句。
是否可以使用通配符在手柄块帮助器中运行like
或indexof
样式比较?
即
{{#if folderPath == "content/published/.*"}}
Render content
Else, do nothing
感谢任何帮助, 感谢
答案 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);
});
模板应如下所示(Expressions,Block 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);