2

我创建了一个 Handlebars 助手,如下所示。

Handlebars.registerHelper("format_currency", function(value, currency){

    var symbol = "";
    if(currency === "EUR") symbol = "€";
    else if ... // other code here

    return value + " " + symbol;
});

我以下列方式使用

{{format_currency amount currency}}

当我运行应用程序应用程序时,值字段具有正确的值(例如 1.5),而对象中的货币在内部散列哈希属性。为什么?在这里,我希望我传入的货币(比如“欧元”)。

我错过了什么吗?谢谢。

4

1 回答 1

8

我不知道“在内部散列散列属性的对象”是什么意思,但我发现您的助手(或您使用它的方式)存在一个问题,这将使其产生奇怪的结果。

当您使用 时{{...}},Handlebars 需要纯文本,因此它将对其进行 HTML 编码。因此,如果您symbol最终是"€",则与符号将被 HTML 编码,并且您将被€添加到您的模板中,而不是欧元符号的 Unicode 实体。

有几种方法可以解决这个问题。

三重藏匿处

解决编码问题的一种方法是在模板中使用三重隐藏来禁用 HTML 编码:

{{{format_currency amount currency}}}

演示:http: //jsfiddle.net/ambiguous/Q4FcR/

纯Unicode

另一种方法是放弃实体以支持原始 Unicode Euro 字符:

if(currency === "EUR")
    symbol = '€';

然后您不必担心双重存储或三重存储或 HTML 编码或......

演示:http: //jsfiddle.net/ambiguous/Mfuk7/

安全字符串

另一种方法是返回 aHandlebars.SafeString而不是 a String

车把不会逃过一劫Handlebars.SafeString。如果您编写一个生成自己的 HTML 的帮助程序,您通常会希望返回一个new Handlebars.SafeString(result).

所以你的助手中有这个:

return new Handlebars.SafeString(value + " " + symbol);

演示:http: //jsfiddle.net/ambiguous/AZtCE/

于 2013-10-11T18:42:32.027 回答