Supponendo che ho una struttura di dati come questo:ricorsione con doT.js
{ list: [ {
name: "1",
children: [{
name: "1.1",
children: []
},
{
name: "1.2",
children: [{
name: "1.2.1",
children: []
}
]
}
]
},
{
name: "2",
children: [{
name: "2.1",
children: [{
name: "2.1.1",
children: []
},
{
name: "2.1.2",
children: []
},
{
name: "2.1.3",
children: []
}
]
},
{
name: "2.2",
children: []
},
{
name: "2.3",
children: []
}
]
},
{
name: "3",
children: [{
name: "3.1",
children: []
}
]
}
]
}
Come potrei fare per la creazione di un modello con doT.js che ricorsivamente passare attraverso l'oggetto e costruire liste annidate?
Costruire la stringa di codice HTML direttamente in JS con una funzione ricorsiva è dritto abbastanza avanti: (http://jsfiddle.net/fergal_doyle/WN8hZ/5/)
var html = "";
function buildList(a){
if (a.length == 0){return};
html += "<ul>";
for (var i = 0; i < a.length; i++)
{
html += "<li>" + a[i].name;
buildList(a[i].children);
html += "</li>";
}
html += "</ul>";
}
buildList(data.list);
$("#out").html(html);
Ma con doT.js questo è quello che ho e dopo che io sono perplesso ! (http://jsfiddle.net/fergal_doyle/BTZpu/4/)
EDIT: posso farlo mescolando in qualche JS con la valutazione (http://jsfiddle.net/fergal_doyle/he8AN/)
{{ function buildList(a) { }}
{{?a.length}}
<ul>
{{~a :v}}
<li>
{{=v.name}}
{{ buildList(v.children); }}
</li>
{{~}}
</ul>
{{?}}
{{ } }}
{{ buildList(it.list); }}
stavo cercando di raggiungerlo con parziali. Definendo un ul snippet, lo snippet chiama se stesso passando un array come parametro, ma sto ricevendo un errore di "ricorsione troppo". Se c'è un modo per far funzionare il sotto, è molto più ordinato di quanto penso sopra. (http://jsfiddle.net/fergal_doyle/qazGe/4/)
{{##def.ul:a:
<ul>
{{~a :value}}
<li>{{=value.name}}{{#def.ul:value.children}}</li>
{{~}}
</ul>
#}}
{{#def.ul:it.list}}