把手助手无法正常工作

时间:2013-10-11 11:04:43

标签: javascript html handlebars.js

我创建了一个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),而对象中的货币散列哈希属性。为什么?在这里,我希望我输入的货币(比如说“EUR”)。

我错过了什么吗?感谢。

1 个答案:

答案 0 :(得分:5)

我不知道“散列内部哈希属性的对象”是什么意思,但我发现你的助手(或者你使用它的方式)有一个问题会导致它产生奇怪的结果。

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

解决此问题有几种方法。

Triple Stashes

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

{{{format_currency amount currency}}}

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

普通Unicode

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

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

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

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

SafeString

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

  

把手不会逃脱Handlebars.SafeString。如果您编写生成自己的HTML的帮助程序,通常需要返回new Handlebars.SafeString(result)

所以你在帮手中有这个:

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

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