gpt4 book ai didi

javascript - Ractivejs 中的递归部分超出调用堆栈

转载 作者:行者123 更新时间:2023-11-29 16:58:28 25 4
gpt4 key购买 nike

自从发现 Ractivejs 以来,我正在慢慢地将我的应用程序转移到它上面。

之前,我使用 vanilla JavaScript 构建了一个 html 树结构来创建元素,然后在完成后将其附加到页面。我最近将它移到了 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>

最佳答案

通常,当您超出调用堆栈时,这是因为 Ractive 处理缺失数据属性的方式 - 如果您有 {{with foo}}{{bar}}{{/with}}foo.bar 不存在,{{bar}} 引用未解析,因此它“进入上下文堆栈”,并查找 bar 代替。

大多数时候这真的很方便,但在这种情况下可能会有问题,因为如果树中的项目没有 childPages 属性,Ractive 将进入堆栈给父级——它把我们送进了无限递归的兔子洞。

有两种解决方法:

  • 确保树中的每个节点都有一个 childPages 属性,即使它是一个空数组,或者...
  • 使用受限引用。如果您使用 this.childPages 而不是仅使用 childPages(或 ./childPages - 它是等效的,您可能对其中一个有审美偏好other) 那么 Ractive 将不会在当前上下文之外寻找数据。这是一个例子,删除了所有空的 childPages 数组 - 没有 this.,我们立即超出了调用堆栈,但因为它在那里我们是完全安全的。

var ractive = new Ractive({
el : 'body',
template: '#treeNode',
data: {
'childPages' : [{
'name': 'first child'
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child'
}, {
'name': 'second second sub child'
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child'
}]
}]
}]
}
});
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<script id="treeNode" type="text/ractive">
<ul>
{{#each this.childPages}}
<li>
{{name}}
{{#if this.childPages}}
{{> treeNode}}
{{/if}}
</li>
{{/each}}
</ul>
</script>

关于javascript - Ractivejs 中的递归部分超出调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com