在把手中的助手内渲染模板

时间:2012-07-23 10:14:20

标签: html rendering helpers handlebars.js templating

嘿伙计们!

因为似乎没有答案: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返回?

/帕斯卡

2 个答案:

答案 0 :(得分:26)

我只想指出使用三重括号无需运行任何其他方法来转换为HTML。例如,访问模板数据时,只需使用三个花括号{{{templateData}}},这样就可以获得原始HTML。

答案 1 :(得分:21)

来自Handlebars doc

  

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