我的JSON数据源如下所示:
{"1":{
"name":"One",
"color":"red"
},
{"2":{
"name":"Two",
"color":"green"
}
我正在尝试使用mustache.js循环遍历这些记录。
var model = [{"1":{"name":"One","color":"red"},{"2":{"name":"Two","color":"green"}];
var template = '<ul> {{#.}} <li>{{name}} -- {{color}} </li> {{/.}} </ul>';
var html = Mustache.to_html(template, model);
console.log(html);
但我无法弄清楚如何访问名称和颜色。有什么想法吗?
答案 0 :(得分:1)
var model = [
{"1":{"name":"One","color":"red"}},
{"2":{"name":"Two","color":"green"}}
];
var model4view = {dots:
model.map(function(obj){
var v; for (k in obj) {v = obj[k];}; return v; })};
template = "'<ul> {{#dots}} <li>{{name}} -- {{color}} </li> {{/dots}} </ul>'";
var html = Mustache.to_html(template, model4view);
参考mustache manual page 部分的AFAIK是允许呈现一次或多次的文本块的标记类型,但是该部分的行为由密钥的值确定。因此我们需要一个键和一个值作为列表。因此,数组必须是键的值。
在上面的代码中我使用Array.prototype.map()
获得一个model4view
,其中键具有任意名称:dots
(因此我们可以在小胡子标记{{#dots}}
中使用此名称,并使用值,包含原始数字数组项值的对象值。例如:
{"dots":[
{"name":"One","color":"red"},
{"name":"Two","color":"green"}
]}
<强> [编辑] 强> 如果您还需要输出与每个项目相关联的数字,您可以使用地图功能:
function(v){
for (var property in v) {
o = v[property];
o['id'] = property;
return(o);
}});
这样,数字可以在模板中用作{{id}}
。
Here is my fiddle您可以尝试使用解决方案。
答案 1 :(得分:1)
如果你有这样的对象数组并使用简单的{{#.}} <li>{{name}} -- {{color}} </li> {{/.}}
循环会更容易:
var myCars =
[
{"index":1,"name":"One", "color":"red" }},
{"index":2,"name":"Two", "color":"green" }}
];
但是,如果您不想更改数组内容或遍历它,这个伏都教可能会帮助您:
此处示例:http://jsfiddle.net/9qMqW/2/
var myCars =
[
{"1":{ "name":"One", "color":"red" }},
{"2":{ "name":"Two", "color":"green" }}
];
// decorate the array with method supporting the exotic indexing
myCars.getNextCar = function(){
!myCars.i ? myCars.i=1 : ++myCars.i;
return(myCars[myCars.i-1][myCars.i])
};
var template = $("#carsTemplate").html();
$("#carsContainer").html(Mustache.render(template,{cars:myCars}));
您的HTML将是:
<div id="carsContainer">
</div>
<script id="carsTemplate" type="text/plain">
<ul>
{{#cars}}
{{#cars.getNextCar}}
<li>{{name}} -- {{color}}</li>
{{/cars.getNextCar}}
{{/cars}}
</ul>
</script>
请注意,方法getNextCar
它将在您的对象中创建一个迭代器,因此如果您使用多次,则必须获得一个新的迭代器。或者像其他海报建议的那样更改数组内容。
在旁注中,您可能希望查看http://handlebarsjs.com/,它更灵活,语法更灵活。
答案 2 :(得分:0)
这是最简单的解决方案,如果您知道模型中的键总是看起来像1,2,3,......:
var model = [{"1":{"name":"One","color":"red"}},{"2":{"name":"Two","color":"green"}}];
var i, len = model.length;
for (i=0; i<len; i++) {
model[i] = model[i][i+1];
}
请注意,您错过了模型上的结束曲线。