我已经设置了花式树以通过延迟加载来打开,并且效果非常好。

$("#tree").fancytree({
        selectMode: 1, quicksearch:true, minExpandLevel:2,
        autoScroll: true,
        source: [{
            title: "Root",
            key: "1",
            lazy: true,
            folder: true
        }],
        lazyLoad: function(event, data) {
            var node = data.node;
            data.result = {
                url: "getTreeData.jsp?parent=" + node.key,
                data: {
                    mode: "children",
                    parent: node.key
                },
                cache: false
            };
        }


    });


但是,如果用户以前在树上选择了一个点,则希望树打开到该点。
我有一个名为hierarchy的变量,它看起来像“ 1/5/10/11/200”,并保存到该特定点的键序列。

以下内容不起作用:

$("#tree").fancytree("getTree").getNodeByKey("1").setExpanded();
$("#tree").fancytree("getTree").getNodeByKey("5").setExpanded();
$("#tree").fancytree("getTree").getNodeByKey("10").setExpanded();
$("#tree").fancytree("getTree").getNodeByKey("11").setExpanded();
$("#tree").fancytree("getTree").getNodeByKey("200").setExpanded();


显然,之所以不起作用的原因是,在一个语句和下一个语句之间需要有一些延迟。

以下代码有效,但是在我看来却很杂乱:

function openNode(item) {

   $("#tree").fancytree("getTree").getNodeByKey(String(item)).setExpanded();
}

function expandTree(hierarchy) {
  var i=0;
  hierarchy.split("/").forEach(function (item) {
  if (item!="") {
     i++;
     window.setTimeout(openNode, i*100,item);
  }
});


有没有更整洁的方法可以打开树上的特定点?

最佳答案

以下代码似乎可以解决问题。

它改编自

http://wwwendt.de/tech/fancytree/doc/jsdoc/Fancytree.html#loadKeyPath

function expandTree(hierarchy) {
    $('#tree').fancytree("getTree").loadKeyPath(hierarchy).progress(function(data) {
        if (data.status === "loaded") {
            console.log("loaded intermediate node " + data.node);
            $('#tree').fancytree("getTree").activateKey(data.node.key);
        } else if (data.status === "ok") {}
    }).done(function() {});
}

10-05 21:44