3
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 标记 (&) 注意 - 我尝试将它们重新声明为字符串,但 JS 在渲染时仍将它们解释为数字,即

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

2 回答 2

4

你的模板有点不对劲。尝试使用 {{.}} 而不是 {{0}} 或 {{&0}} 将当前元素引用为字符串。

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

这是一个 jsFiddle 来演示:Fiddle

根据 Mustache 规范,{{.}} 将标识迭代中的当前元素,并将小数转换为字符串。在您的情况下,您从字符串开始,这确实是保留小数点为 0 位(1.0 === 1)所必需的。

小胡子规范(~第 157 行):sections.yml

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

只有在处理 HTML 时才需要尝试转义。

我希望这会有所帮助!

于 2013-03-07T14:42:22.780 回答
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"

于 2013-03-07T18:04:09.590 回答