admin管理员组文章数量:1026989
var template = Mustachepile("{{#list}}<option value=\"{{&0}}\">{{&0}}</option>{{/list}}");
var view = { list: ["1.0", "2.0"] };
var output = template(view);
In the above snippet the numbers output in to HTML are 'prettified' i.e.
"1.0" => 1
"2.0" => 2
It is important to the application that these numbers are printed exactly as received. The items going in to the list may not always be numbers or have the same number of decimal places.
How can I force them to be printed as received/treated as Strings?
Note - I have also used the unescape tag (&) Note - I have tried re-declaring them as Strings but JS still interprets them as Numbers when rendered i.e.
var view = { list: [new String("1.0"), new String("2.0")] };
var template = Mustache.pile("{{#list}}<option value=\"{{&0}}\">{{&0}}</option>{{/list}}");
var view = { list: ["1.0", "2.0"] };
var output = template(view);
In the above snippet the numbers output in to HTML are 'prettified' i.e.
"1.0" => 1
"2.0" => 2
It is important to the application that these numbers are printed exactly as received. The items going in to the list may not always be numbers or have the same number of decimal places.
How can I force them to be printed as received/treated as Strings?
Note - I have also used the unescape tag (&) Note - I have tried re-declaring them as Strings but JS still interprets them as Numbers when rendered i.e.
var view = { list: [new String("1.0"), new String("2.0")] };
Share
Improve this question
asked Mar 7, 2013 at 14:10
R DayR Day
97210 silver badges25 bronze badges
2 Answers
Reset to default 4Your template is just a little off. Try using {{.}} instead of {{0}} or {{&0}} to refer to the current element as a string.
var template = Mustache.pile("{{#list}}<option value=\"{{.}}\">{{.}}</option>{{/list}}");
Here is a jsFiddle to demonstrate: Fiddle
As per the Mustache spec, {{.}} will identify the current element in the iteration and should cast decimals as strings. In your case you start with strings, which is indeed necessary to retain the decimal with a 0 digit (1.0 === 1).
Mustache spec (~line 157): sections.yml
I'm unfamiliar with using {{0}} instead, but clearly it behaves a little differently. I didn't find anything in the spec regarding its usage.
The escaping you tried should only be necessary when dealing with HTML.
I hope that helps!
{{0}}
(or {{&0}}
for that matter) isn't doing something strange because of an encoding or conversion issue, it's doing something strange because you asked it to :)
In Mustache, lookups are tried first against the current scope, then against the parent scope, and all the way up the stack.
Given this data:
{list: ["1.0", "2.0"]}
And this Mustache template:
{{# list }}{{ 0 }}{{/ list }}
Your rendering context stack starts out as:
[
{list: ["1.0", "2.0"]}
]
But as soon as you enter that {{# list }}
section, and it starts iterating over the list items, the context stack is:
[
{list: ["1.0", "2.0"]}, // same as before
"1.0" // or, "2.0" in the second trip through the loop...
]
So any tag inside the section will be tried against the "1.0"
first, and if that's unsuccessful, will be tried against the {list: ["1.0", "2.0"]}
. So really, what your {{&0}}
meant was "1.0"[0]
and "2.0"[0]
...
Which, of course, evaluates to "1"
and "2"
.
var template = Mustachepile("{{#list}}<option value=\"{{&0}}\">{{&0}}</option>{{/list}}");
var view = { list: ["1.0", "2.0"] };
var output = template(view);
In the above snippet the numbers output in to HTML are 'prettified' i.e.
"1.0" => 1
"2.0" => 2
It is important to the application that these numbers are printed exactly as received. The items going in to the list may not always be numbers or have the same number of decimal places.
How can I force them to be printed as received/treated as Strings?
Note - I have also used the unescape tag (&) Note - I have tried re-declaring them as Strings but JS still interprets them as Numbers when rendered i.e.
var view = { list: [new String("1.0"), new String("2.0")] };
var template = Mustache.pile("{{#list}}<option value=\"{{&0}}\">{{&0}}</option>{{/list}}");
var view = { list: ["1.0", "2.0"] };
var output = template(view);
In the above snippet the numbers output in to HTML are 'prettified' i.e.
"1.0" => 1
"2.0" => 2
It is important to the application that these numbers are printed exactly as received. The items going in to the list may not always be numbers or have the same number of decimal places.
How can I force them to be printed as received/treated as Strings?
Note - I have also used the unescape tag (&) Note - I have tried re-declaring them as Strings but JS still interprets them as Numbers when rendered i.e.
var view = { list: [new String("1.0"), new String("2.0")] };
Share
Improve this question
asked Mar 7, 2013 at 14:10
R DayR Day
97210 silver badges25 bronze badges
2 Answers
Reset to default 4Your template is just a little off. Try using {{.}} instead of {{0}} or {{&0}} to refer to the current element as a string.
var template = Mustache.pile("{{#list}}<option value=\"{{.}}\">{{.}}</option>{{/list}}");
Here is a jsFiddle to demonstrate: Fiddle
As per the Mustache spec, {{.}} will identify the current element in the iteration and should cast decimals as strings. In your case you start with strings, which is indeed necessary to retain the decimal with a 0 digit (1.0 === 1).
Mustache spec (~line 157): sections.yml
I'm unfamiliar with using {{0}} instead, but clearly it behaves a little differently. I didn't find anything in the spec regarding its usage.
The escaping you tried should only be necessary when dealing with HTML.
I hope that helps!
{{0}}
(or {{&0}}
for that matter) isn't doing something strange because of an encoding or conversion issue, it's doing something strange because you asked it to :)
In Mustache, lookups are tried first against the current scope, then against the parent scope, and all the way up the stack.
Given this data:
{list: ["1.0", "2.0"]}
And this Mustache template:
{{# list }}{{ 0 }}{{/ list }}
Your rendering context stack starts out as:
[
{list: ["1.0", "2.0"]}
]
But as soon as you enter that {{# list }}
section, and it starts iterating over the list items, the context stack is:
[
{list: ["1.0", "2.0"]}, // same as before
"1.0" // or, "2.0" in the second trip through the loop...
]
So any tag inside the section will be tried against the "1.0"
first, and if that's unsuccessful, will be tried against the {list: ["1.0", "2.0"]}
. So really, what your {{&0}}
meant was "1.0"[0]
and "2.0"[0]
...
Which, of course, evaluates to "1"
and "2"
.
本文标签: javascriptHow to force Mustache to render Number as StringStack Overflow
版权声明:本文标题:javascript - How to force Mustache to render Number as String? - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1745651163a2161327.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论