javascript - 如何渲染任意深度的嵌套列表?

标签 javascript html knockout.js

假设我有以下 JSON 数组:

tree = [{
    name: "A",
    children: [{
        name: "AA",
        children: []
    }, {
        name: "AB",
        children: []
    }]
}, {
    name: "B",
    children: [{
        name: "BA",
        children: []
    }, {
        name: "BB",
        children: []
    }]
}]

此外,假设我想构建以下 HTML:

<ul>
    <li>
        <label>A</label>
        <ul>
            <li>
                <label>AA</label>
                <ul></ul>
            </li>
            <li>
                <label>AB</label>
                <ul></ul>
            </li>
        </ul>
    </li>
    <li>
        <label>B</label>
        <ul>
            <li>
                <label>BA</label>
                <ul></ul>
            </li>
            <li>
                <label>BB</label>
                <ul></ul>
            </li>
        </ul>
    </li>
</ul>

我可以使用 Knockout 来实现此目的,如下所示:

<ul data-bind="foreach: tree">
    <li>
        <label data-bind="text: name"></label>
        <ul data-bind="foreach: children">
            <li>
                <label data-bind="text: name"></label>
                <ul></ul>
            </li>
        </ul>
    </li>
</ul>

但是,这不适用于任意深度的嵌套列表。我能做什么?

最佳答案

使用递归 template ,例如像这样:

var tree = {
  subItems: [
    { 
      name: "A", 
      subItems: [ { name:"AA", subItems: [] }, { name:"AB", subItems: [] }, { name:"AC", subItems: [] } ] 
    },
    { 
      name: "B", 
      subItems: [ { name:"BA", subItems: [] }, { name:"BB", subItems: [{name:"BB1 (etc)", subItems: []}] } ] 
    }
  ]
};

ko.applyBindings(tree);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<script type="text/html" id="myTemplate">
    <ul data-bind="foreach: $data">
        <li>
            <label data-bind="text: name"></label>
            <div data-bind="template: { name: 'myTemplate', data: subItems }"></div>
        </li>
    </ul>
</script>

<div data-bind="template: { name: 'myTemplate', data: $root.subItems }"></div>

关于javascript - 如何渲染任意深度的嵌套列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048987/

相关文章:

javascript - 单击单选按钮显示日历以及 jquery 中的一个输入框

javascript - Dojo DataGrid、jQuery Grid 还是 DataTables 哪个更好?

javascript - 如何在两个或多个点之间画线? (积分可以动态改变)

javascript - 使 Knockout applyBindings 将选择选项视为数字

knockout.js - 可 knockout 排序和掉落元素会引发控制台错误

javascript - JSF 中的 HTML 内容呈现

javascript - 使用 nodemailer 发送邮件

html - css 第一个列表项,但不是嵌套的

javascript - 根据两个输入的太阳替换输入值

javascript - KnockoutJs 不会对自定义事件使用react