代码之家  ›  专栏  ›  技术社区  ›  Grimson

向引导树视图动态添加节点

  •  6
  • Grimson  · 技术社区  · 8 年前

    我目前有一个巨大的JSON文件(超过15k行,大小可能会增加),我想用它构建一个引导树视图。添加所有节点将使页面加载速度非常慢,因此我计划创建一个服务来获取所选节点的JSON,并相应地填充树视图。这就是我现在拥有的。

    <!DOCTYPE html>
    <html>
    <head>
        <title>Bootstrap Tree View</title>
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <link href="./TreeView_files/bootstrap-treeview.css" rel="stylesheet">
    </head>
    <body>
        <div class="container">
            <h1>Bootstrap Tree View - DOM Tree</h1>
            <br/>
            <div class="row">
                <div class="col-sm-12">
                    <label for="treeview"></label>
                    <div id="treeview"/>
                </div>
            </div>
        </div>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script src="./TreeView_files/bootstrap-treeview.js"></script>
        <script type="text/javascript">
    
            function buildDomTree() {
                var tree = [
                {
                    text: "Parent 1",
                    nodes: [
                    {
                        text: "Child 1",
                        nodes: [
                        {
                            text: "Grandchild 1"
                        },
                        {
                            text: "Grandchild 2"
                        }
                        ]
                    },
                    {
                        text: "Child 2"
                    }
                    ]
                },
                {
                    text: "Parent 2"
                },
                {
                    text: "Parent 3"
                },
                {
                    text: "Parent 4"
                },
                {
                    text: "Parent 5"
                }
                ];
                return tree;
            }
    
            $(function() {
    
                var options = {
                    bootstrap2: false, 
                    showTags: true,
                    levels: 5,
                    data: buildDomTree()
                };
    
                $('#treeview').treeview(options);
            });
        </script>
    </body>
    

    Treeview可以深入4个级别,每次单击节点时,我都想获取下一级别的JSON。所以,如果我点击“Parent 5”,它应该会弹出子节点。 我不知道如何动态添加节点。任何帮助都将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Grimson    8 年前

    应要求回答:我已经找到了一种方法来做这件事,尽管它有点低效。我所做的是,我保留所有扩展节点的状态,当我单击一个节点进行扩展时,我发出HTTP请求,将新节点添加到旧节点,重新绘制整个树,并重新扩展所有以前扩展的节点。我知道这效率很低,但这是我唯一可以找到的方法,而不必深入细节,也不必亲自重新创建整个树(这只是一个美化的递归应用程序)。

    这是我发布问题时使用的代码。显然还有改进的余地。

    var expandedNodes = [];
    var tree = [];
    
    $(function()
    {
        $.post("http://localhost:8000/getLevel1", function( data ) 
        {
            var JSObject = JSON.parse(data);
    
            for (j in JSObject)
                tree.push(JSObject[j]);
    
            createTree();
        });
    });
    
    function createTree(){
    
        var options = {
            bootstrap2: false, 
            showTags: true,
            levels: 0,
            data: tree,
            expandIcon: 'fa fa-chevron-right',
            collapseIcon: 'fa fa-chevron-down',
            onNodeExpanded: nodeExpand,
            onNodeCollapsed: nodeCollapse,
            onNodeSelected: nodeSelect,
            onNodeUnselected: nodeUnselect
        }
        $('#treeview').treeview(options);
        for (node in expandedNodes)
            $('#treeview').treeview('expandNode', [ expandedNodes[node], { levels: 0, silent: true } ]);
        $('#treeview').treeview('expandNode', 0, { silent: true } );
    };
    
    
    function nodeExpand(event, data)
    {
        expandedNodes.push(data.nodeId);
        var requestObject = []
        requestObject.push(data.text);
    
        var parent, dummy = data;
        while ((parent = $('#treeview').treeview('getParent', dummy.nodeId))["nodeId"] != undefined)
            {
            requestObject.push(parent.text);
            dummy = parent;
        }
    
        $.post("http://localhost:8000/getNode?param=" + JSON.stringify(requestObject), function(retVal) 
        {
            var JSObject = JSON.parse(retVal);
            var node = findNode(requestObject);
            node.nodes = JSObject;
            createTree();
        });
    }
    
    function nodeCollapse(event, data)
    {
        var index = expandedNodes.indexOf(data.nodeId);
        if (index > -1) 
            expandedNodes.splice(index, 1);
    }
    
    function nodeSelect(event, data)
    {
        if (data.state.expanded == true)
            $('#treeview').treeview('collapseNode', data.nodeId);
        else
            $('#treeview').treeview('expandNode', data.nodeId);
        //$('#treeview').treeview('unselectNode', [ data.nodeId, { silent: true } ]);
    }
    
    function nodeUnselect(event, data)
    {
    }
    
    function findNode(array)
    {
        var searchIn = tree; //array
        var lastFound = tree;
        for (var i = array.length - 1; i >= 0; i--)
            {
            var obj = searchInObject(searchIn, array[i]);
            searchIn = obj.nodes;
            lastFound = obj;
        }
    
        return lastFound;
    }
    
    function searchInObject(objectArray, string)
    {
        for (var index in objectArray)
            if (objectArray[index].text == string)
                return objectArray[index];
    }
    
    $(document).ready(function () {
        var trigger = $('.hamburger'),
        overlay = $('.overlay'),
        isClosed = false;
        hamburger_cross();
        $('#wrapper').toggleClass('toggled');
    
        trigger.click(function () {
            hamburger_cross();      
        });
    
        function hamburger_cross() {
    
            if (isClosed == true) {          
                overlay.hide();
                trigger.removeClass('is-open');
                trigger.addClass('is-closed');
                isClosed = false;
                $('#open_arrow').removeClass('fa-chevron-circle-left').addClass('fa-chevron-circle-right');
            } else {   
                overlay.show();
                trigger.removeClass('is-closed');
                trigger.addClass('is-open');
                isClosed = true;
                $('#open_arrow').removeClass('fa-chevron-circle-right').addClass('fa-chevron-circle-left');
            }
        }
    
        $('[data-toggle="offcanvas"]').click(function () {
            $('#wrapper').toggleClass('toggled');
    
        });  
    });
    

    兴趣点是 nodeExpand 和 createTree