如何强制Mustache将Number渲染为String?

时间:2013-03-07 14:10:32

标签: javascript mustache

var template = Mustache.compile("{{#list}}<option value=\"{{&0}}\">{{&0}}</option>{{/list}}");

var view = { list: ["1.0", "2.0"] };

var output = template(view);

在上面的代码片段中输出到HTML的数字是“美化的”,即

"1.0" => 1
"2.0" => 2

对于应用程序来说,这些数字的打印与收到的完全一致非常重要。进入列表的项目可能并不总是数字或具有相同的小数位数。

如何强制将它们打印为接收/处理为字符串?

注意 - 我还使用了unescape标签(&amp;) 注意 - 我尝试将它们重新声明为字符串,但JS在呈现时仍然将它们解释为数字。

var view = { list: [new String("1.0"), new String("2.0")] };

2 个答案:

答案 0 :(得分:4)

您的模板稍微偏离了一点。尝试使用{{。}}代替{{0}}或{{&amp; 0}}来将当前元素称为字符串。

var template = Mustache.compile("{{#list}}<option value=\"{{.}}\">{{.}}</option>{{/list}}");

这是一个证明:Fiddle

的jsFiddle

根据Mustache规范,{{。}}将标识迭代中的当前元素,并应将小数转换为字符串。在你的情况下,你开始使用字符串,这确实是必要的,以保持小数字与0位(1.0 === 1)。

胡子规格(〜第157行):sections.yml

我不熟悉使用{{0}},但显然它的行为略有不同。我没有在规范中找到任何关于其用法的内容。

只有在处理HTML时才需要进行转义。

我希望有所帮助!

答案 1 :(得分:2)

{{0}}(或者{{&0}}因为编码或转换问题而没有做出奇怪的事情,因为你要求它做的事情很奇怪:)

在Mustache中,首先针对当前范围尝试查找,然后针对父范围尝试查找,并一直尝试查找。

鉴于此数据:

{list: ["1.0", "2.0"]}

这个Mustache模板:

{{# list }}{{ 0 }}{{/ list }}

渲染上下文堆栈的开头为:

[
  {list: ["1.0", "2.0"]}
]

但是只要你输入{{# list }}部分,并且它开始迭代列表项,上下文堆栈就是:

[
  {list: ["1.0", "2.0"]}, // same as before
  "1.0"                   // or, "2.0" in the second trip through the loop...
]

因此,该部分中的任何标记都将首先针对"1.0"进行尝试,如果不成功,将针对{list: ["1.0", "2.0"]}进行尝试。实际上,{{&0}}的含义是"1.0"[0]"2.0"[0] ......

当然,评估为"1""2"