提问者:小点点

车把助手内渲染模板


因为这个问题似乎没有答案:通过车把部分传递变量,我目前正在做一个小小的变通方法来完成这项工作。所以,这个想法是注册一个帮助函数,它用可能的值呈现一个特定的模板。一点代码让它更容易理解。

这是我调用助手的方式:

<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>

这个小变通方法对我有效,但有一个问题。如上所述注册帮助程序,返回一个普通的超文本标记语言转义字符串。因此,调用帮助程序不会输出呈现的超文本标记语言片段。它将超文本标记语言输出为转义字符串。

你们中有人知道如何让我的代码片段将超文本标记语言作为超文本标记语言返回吗?

/Pascal


共2个答案

匿名用户

我只想指出,使用三括号无需运行任何额外的方法来转换为超文本标记语言。例如,在访问模板数据时,只需使用三个花括号{{templateData}}},它允许您获取原始超文本标记语言。

匿名用户

来自HandleBar文档:

Handlebar不会转义Handlebar. SafeString。如果您编写了一个生成自己的超文本标记语言的帮助程序,您通常需要返回一个新的Handlebar.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));
});