把手:根据模板注册帮助者的“身体内容”

时间:2013-12-12 16:06:11

标签: handlebars.js

我正在尝试使用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中使用内置机制来处理这个问题?

由于

1 个答案:

答案 0 :(得分:0)

您需要使用{{{triple stashes}}}来取消HTML注入。因此,您的模板应如下所示:

<p>Hello {{ who }}<p>
{{{ bodyContent }}}
<p>Bye !</p>

您可以阅读更多here