Handlebars 助手 - 返回 HTML 而不是文本

Posted

技术标签:

【中文标题】Handlebars 助手 - 返回 HTML 而不是文本【英文标题】:Handlebars helper - returning HTML not text 【发布时间】:2013-12-04 23:20:50 【问题描述】:

我为我的模板写了一个简单的助手。代码如下:

Handlebars.registerHelper('splitQuote', function (string) 
    if (string.indexOf('|') !== -1) 
        return string.replace('|', '<span>') + '</span>';
    
    return string;
);

所以我传递一个字符串,并用'|'分割字符串特点。我也想把第二部分放到 span 标签中。

问题是,返回的结果是纯文本,所以我得到像文本一样的 span 标签,而不是 html

有人知道有什么问题吗?

Tnx

【问题讨论】:

【参考方案1】:

您不需要使用SafeString。相反,请使用车把上的“三胡”:

来自Handlebars web site,HTML 转义部分:

Handlebars HTML 转义 expression 返回的值。如果您不希望 Handlebars 转义值,请使用“triple-stash”,.

因此,在您的 html 中使用简单的三引号将避免转义:

splitQuote 

【讨论】:

这应该是公认的答案/首选方式【参考方案2】:

如果你想让 Handlebars 不转义它,你必须在你的助手中将字符串标记为 html。使用Handlebars.safeString 来执行此操作。以下应该适合您的需求

Handlebars.registerHelper('splitQuote', function(string) 
    if (string.indexOf('|') !== -1) 
        return new Handlebars.SafeString(string.replace('|', '<span>') + '</span>');
    
    return string;
);

如 cmets 中所述,您可能应该在进行自定义格式化之前使用 Handlebars.Utils.escapeExpression(string) 对传递的字符串进行转义以对字符串进行编码。我建议这样写:

Handlebars.registerHelper('splitQuote', function(string) 
    string = Handlebars.Utils.escapeExpression(string);
    if (string.indexOf('|') !== -1) 
        string = string.replace('|', '<span>') + '</span>';
    
    return new Handlebars.SafeString(string); // mark as already escaped
);

【讨论】:

如果您要使用 SafeString,您应该在添加 &lt;span&gt;s 之前手动对 string 进行 HTML 编码。

以上是关于Handlebars 助手 - 返回 HTML 而不是文本的主要内容,如果未能解决你的问题,请参考以下文章

将 someVar+'a string' 传递给 Handlebars.js 助手?

如何覆盖 Handlebars 的 `if` 助手

Ember.js - 使用 Handlebars 助手检测子视图是不是已呈现

使用 each 和 handlebars 助手对对象键进行排序

认识Handlebars

车把/小胡子 - 缺少助手:“部分”