通过延迟加载扩展 fancyTree

Expanding a fancyTree via lazy load

我已经将我的 fancytree 设置为通过延迟加载打开,效果非常好。

$("#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() {});
}