嘿伙计们!
因为似乎没有答案:Passing variables through handlebars partial,我现在正在努力解决这个问题。因此,我们的想法是注册一个辅助函数,该函数使特定模板具有可能的值。有点代码可以让你更好地理解。
这是我如何调用我的助手:
<div>
{{myHelper}}
</div>
这个助手注册了这个小代码:
hbs.registerHelper(name, function (args) {
args = args || {};
var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8'));
return template(args);
});
我把这个snippiet放到一个循环中,一次注册不同的帮助器。这意味着'name'和'file'。
好的,现在我可以做这样的事情:
// 'values' could be something like this:
var values = { headline: 'HEADLINE' }
<div>
{{myHelper values}}
</div>
在帮助器中,我现在可以测试是否给出了某些值:
// myHelper template
<div>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem ipsum</p>
</div>
这个小解决方案对我有用,但有一个问题。如上所述注册助手,返回纯HTML转义字符串。因此,调用帮助程序不会输出呈现的HTML代码段。它将HTML作为转义字符串输出。
你是否有人知道如何让我的代码片段将HTML作为HTML返回?
/帕斯卡
答案 0 :(得分:26)
我只想指出使用三重括号无需运行任何其他方法来转换为HTML。例如,访问模板数据时,只需使用三个花括号{{{templateData}}}
,这样就可以获得原始HTML。
答案 1 :(得分:21)
Handlebars不会逃脱Handlebars.SafeString。如果您编写一个生成自己的HTML的帮助程序,通常会 想要返回一个新的Handlebars.SafeString(结果)。在这样的 在这种情况下,您需要手动转义参数。
尝试
hbs.registerHelper(name, function (args) {
args = args || {};
var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8'));
// return new hbs.SafeString(template(args));
// From @Maroshii
// the SafeString method must be accessed through hbs.handlebars
// and not directly through hbs
// https://github.com/donpark/hbs#handlebars
return new hbs.handlebars.SafeString(template(args));
});