С момента открытия Ractivejs я постепенно перевожу свое приложение на него.
До того, как я построил древовидную структуру html, используя ванильный JavaScript для создания элементов, а затем добавил ее на страницу после ее завершения. Недавно я перенес его на Ractivejs, который очень хорошо работает с небольшой древовидной структурой, но если дело доходит до глубоко вложенного объекта, он превышает стек вызовов.
Есть ли способ, которым я могу добавить элементы, которые я создал в JavaScript, к шаблону Ractivejs и сохранить на нем события Ractivejs, или есть способ рекурсивно перебирать большой объект, не выходя за пределы стека вызовов?
Примеры
Как строится дерево в JavaScript
var tree = {
'childPages' : [{
'name': 'first child',
'childPages': []
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child',
'childPages': []
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child',
'childPages': []
}]
}]
}]
};
function buildTree (tree) {
var ul = document.createElement('ul');;
for(var i =0; i < tree.childPages.length; i++){
var li = document.createElement('li');
li.innerText = tree.childPages[i].name;
ul.appendChild(li);
if (tree.childPages[i].childPages.length) {
li.appendChild (buildTree(tree.childPages[i]));
}
}
return ul;
}
document.body.appendChild(buildTree(tree));
Как будет построено дерево в шаблоне Ractivejs
var ractive = new Ractive({
el : 'body',
template: '#treeNode',
data: {
'childPages' : [{
'name': 'first child',
'childPages': []
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child',
'childPages': []
}, {
'name': 'second second sub child',
'childPages': []
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child',
'childPages': []
}]
}]
}]
}
});
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<script id="treeNode" type="text/ractive">
<ul>
{{#each childPages}}
<li>
{{name}}
{{#if childPages}}
{{> treeNode}}
{{/if}}
</li>
{{/each}}
</ul>
</script>