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

Pas*_*cht 9 html rendering templating helpers handlebars.js

大家好!

因为似乎没有答案:通过把手部分传递变量,我正在努力解决这个问题.因此,我们的想法是注册一个辅助函数,该函数使特定模板具有可能的值.一些代码使得理解更好.

这是我如何调用我的助手:

<div>
    {{myHelper}}
</div>
Run Code Online (Sandbox Code Playgroud)

这个帮助器注册了这个小代码:

hbs.registerHelper(name, function (args) {
    args = args || {};
    var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8'));
    return template(args);
});
Run Code Online (Sandbox Code Playgroud)

我把这个snippiet放到一个循环中,一次注册不同的帮助器.这意味着给出了'name'和'file'.

好的,现在我可以做这样的事情:

// 'values' could be something like this:

var values = { headline: 'HEADLINE' }

<div>
    {{myHelper values}}
</div>
Run Code Online (Sandbox Code Playgroud)

在帮助器中,我现在可以测试是否给出了某些值:

// myHelper template

<div>
    {{#if headline}}
    <h1>{{headline}}</h1>
    {{/if}}
    <p>Lorem ipsum</p>
</div>
Run Code Online (Sandbox Code Playgroud)

这个小小的解决方法适合我,但有一个问题.如上所述注册助手,返回纯HTML转义字符串.因此,调用帮助程序不会输出呈现的HTML代码段.它将HTML作为转义字符串输出.

你有没有人知道如何让我的代码片段将HTML作为HTML返回?

/帕斯卡尔

小智 26

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


nik*_*shr 21

来自Handlebars doc:

把手不会逃脱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));
});
Run Code Online (Sandbox Code Playgroud)

  • 如果有效,请相应地标记答案 (10认同)
  • 你需要返回"new Handlebars.SafeString(html)"; (2认同)