使用带编号数组的mustache.js

时间:2012-11-09 16:04:30

标签: json mustache

我的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);

但我无法弄清楚如何访问名称和颜色。有什么想法吗?

3 个答案:

答案 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];
}

请注意,您错过了模型上的结束曲线。