把手助手无法正常工作

Lor*_*o B 1 html javascript handlebars.js

我创建了一个Handlebars帮助器,如下所示.

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

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

    return value + " " + symbol;
});
Run Code Online (Sandbox Code Playgroud)

我以下面的方式使用

{{format_currency amount currency}}
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序应用程序时,值字段具有正确的值(比如1.5),而对象中的货币散列哈希属性.为什么?在这里我会期待我通过的货币(比如说"EUR").

我错过了什么吗?谢谢.

mu *_*ort 6

我不知道是什么意思是"散列内的哈希属性的对象",但我看到一个问题,您的助手(或者你使用它的方式),这将使它产生奇怪的结果.

当您使用时{{...}},Handlebars期望纯文本,因此它将对HTML进行编码.因此,如果您的symbol最终结果是"€",&符号将被HTML编码,您将被€添加到您的模板而不是欧元符号的Unicode实体.

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

三重存储

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

{{{format_currency amount currency}}}
Run Code Online (Sandbox Code Playgroud)

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

简单的Unicode

另一种方法是放弃实体,转而使用原始的Unicode Euro字符:

if(currency === "EUR")
    symbol = '€';
Run Code Online (Sandbox Code Playgroud)

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

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

SafeString

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

把手不会逃脱Handlebars.SafeString.如果你编写一个生成自己的HTML的帮助器,你通常会想要返回一个new Handlebars.SafeString(result).

所以你在你的助手中有这个:

return new Handlebars.SafeString(value + " " + symbol);
Run Code Online (Sandbox Code Playgroud)

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