【问题标题】:Rendering templates within helpers in handlebars在把手中的助手内渲染模板
【发布时间】:2012-07-21 13:40:24
【问题描述】:

因为对此似乎没有答案: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);
});

我将这段代码放入一个循环中,以便一次注册不同的助手。这意味着给出了“名称”和“文件”。

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

// '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 sn-p。它将 HTML 输出为转义字符串。

你们中有人知道如何让我的代码 sn-p 将 HTML 作为 HTML 返回吗?

/帕斯卡

【问题讨论】:

    标签: html handlebars.js rendering helper templating


    【解决方案1】:

    我只想指出,使用三方括号消除了运行任何其他方法来转换为 HTML 的需要。例如,在访问模板数据时,只需使用三重花括号 {{{templateData}}},它允许您获取原始 HTML。

    【讨论】:

    • 这帮助我找到了答案! TY
    【解决方案2】:

    来自Handlebars doc

    Handlebars 不会转义 Handlebars.SafeString。如果您编写一个生成自己的 HTML 的帮助程序,您通常会 想要返回一个新的 Handlebars.SafeString(result)。在这样一个 在这种情况下,您将需要手动转义参数。

    试试

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

    【讨论】:

    • 以防万一有人遇到这种情况.... SafeString 方法必须通过hbs.handlebars 访问,而不是直接通过hbs... 这是针对node.js 用户的:)
    • @Maroshii 感谢您的评论,我将其包含在我的回答中
    • Handlebars 有什么变化吗? Handlebars.SafeString 现在是: safestring: function SafeString(string) { this.string = string;并且不返回任何东西。此外,没有 Handlebars.handlebars。
    • 你需要返回"new Handlebars.SafeString(html)";
    • @JasonMcCarrell 感谢您发现缺失的新功能。 hbs.handlebars 的使用是由于 Node.js 上下文。在浏览器中,您确实会直接使用 Handlebars.Safestring
    猜你喜欢
    • 2014-04-20
    • 2019-02-03
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多