我正在尝试使用Handlebars在nodejs应用程序中实现某种“宏”机制(类似于@bodyContent系统的速度。)
在我的主模板中,我希望能够写出这样的内容:
{{#foobar who = user }}
<p>My body content</p>
{{/foobar}}
在“views / helpers / foobar.html”中,我会有一个带有模板的文件,以及一些引用“正文内容”的方法
<p>Hello {{ who }}<p>
{{ bodyContent }}
<p>Bye !</p>
基于“views / helpers”中的模板对应于使用单个hash参数调用的帮助程序的约定,我想自动注册它们;所以我有这样的事情:
var helpers = "./views/helpers/";
fs.readdirSync(helpers).forEach(function (file) {
var source = fs.readFileSync(helpers + file, "utf8"),
helperName = /(.+)\.html/.exec(file).pop();
var helperTemplate = Handlebars.compile(source);
// We assume all helpers in the folder
// would take a hash as their first param
// We'll provide them with all the required context
Handlebars.registerHelper(helperName, function (options) {
var hash = options.hash || {};
// I want to somehow 'pass' the body Content ;
// The closest I have is 'this', but the markup is
// encoded, so I get a string with '<p>My body content</p>'
hash.bodyContent = options.fn(this);
console.log("Body Content", hash.bodyContent);
// Render the source as an handlebar template
// in the context of a hash
return helperTemplate(hash);
});
});
这不起作用,因为标签是转义的,因此bodyContent是一个包含标记的String,而不是标记。
有没有办法可以修复我的助手注册,或者在Handlebars中使用内置机制来处理这个问题?
由于
答案 0 :(得分:0)
您需要使用{{{triple stashes}}}
来取消HTML注入。因此,您的模板应如下所示:
<p>Hello {{ who }}<p>
{{{ bodyContent }}}
<p>Bye !</p>
您可以阅读更多here