首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ractivejs中的递归部分超过调用堆栈

Ractivejs中的递归部分超过调用堆栈
EN

Stack Overflow用户
提问于 2015-05-11 11:27:37
回答 1查看 170关注 0票数 2

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

在我构建一个html树结构之前,我使用vanilla JavaScript创建元素,然后在它完成后将它附加到页面中。我最近把它移到了Ractivejs,它在一个小树结构中工作得很好,但是如果它涉及到一个嵌套很深的对象,它就会超出调用堆栈。

是否有一种方法可以将我在JavaScript中构建的元素附加到Ractivejs模板中,并将Ractivejs事件保存在它上,还是有一种在不超过调用堆栈的情况下递归遍历大型对象的方法?

示例

这棵树是如何在JavaScript中建立的

代码语言: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模板中构建树

代码语言:javascript
复制
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': []
    }]
  }]
}]
  }
});
代码语言:javascript
复制
<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>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 12:38:33

通常,当您超过调用堆栈时,这是因为Ractive处理丢失的数据属性的方式--如果不存在{{with foo}}{{bar}}{{/with}}foo.bar,则{{bar}}引用没有得到解决,因此它会“上升上下文堆栈”,转而查找bar

在大多数情况下,这是非常方便的,但在这种情况下可能会出现问题,因为如果树中的一个项没有childPages属性,RactiveRactive就会上升到父堆栈--这会把我们送下无限递归兔子洞。

有两种解决办法:

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

代码语言:javascript
复制
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'
    }]
  }]
}]
  }
});
代码语言:javascript
复制
<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>

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30166473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档