当前位置: 首页 > 知识库问答 >
问题:

用ajax负载在jstree中编程扩展节点

艾原
2023-03-14

我用jstree制作了一个树,它部分加载,并在扩展节点时通过json_data插件加载。这里是代码的关键:

$("#TreeViewDiv")   
.jstree(
{
    json_data:
    {
        ajax:
        {
            url: "/Website/GetNodes",
            data: function (node) {
                //do some stuff to compile data for backend here

                return {
                    //insert data for backend here
                };
            },
            error: function () {
                $("#TreeViewDiv").html("Error initializing tree");
            }
        }
    },

    plugins: ["json_data", "ui"]
});

然后,我想展开一些节点,并选择一个叶节点,这取决于哪个用户正在访问站点。我在一个循环中执行此操作,如下所示:

var nodeValues = [Parent, firstChild, leaf];

        for (var j = 0; j < nodeValues .length-1; j++) {        
            $("#TreeViewDiv").jstree("open_node", $("input[value='" + nodeValues [j] + "']"));
        }

打开父节点可以正常工作,并且当树显示但firstChild节点未打开时,firstChild将公开。如果我再次启动循环,firstchild将成功打开以显示叶节点。

我的猜测是,当上面的循环试图打开firstChild树节点时,请求还没有完成,并且该树节点不存在。在尝试打开下一个节点之前,是否有一种方法可以等待节点加载?谢谢!

共有1个答案

赵修诚
2023-03-14

好吧,所以我终于想通了。这里有一个方法来处理延迟。可能有一个更简单的方法,但玩了一天后我的头会疼,所以重构必须等待:)

var deffereds = $.Deferred(function (def) { def.resolve(); });

var nodeValues = [Parent, firstChild, leaf];

for (var j = 0; j < nodeValues .length-1; j++) {  
deffereds = (function(name, deferreds) {
                return deferreds.pipe(function () {
                    return $.Deferred(function(def) {
                                                    $("#TreeViewDiv").jstree("open_node", $("input[value='" + name + "']"), function () {
                            def.resolve();
                        });
                    });
                });
            })(nodeValues [j], deffereds);      
 }

这基本上将对open_node的调用放在deferred中,并使用open_node函数的回调来解析deferred,从而确保在打开其父节点之前不打开任何节点。

 类似资料:
  • 问题内容: 我正在尝试让jsTree与子节点的按需加载一起使用。我的代码是这样的: 调用返回的json是 每个元素可以有很多孩子,树会很大。当前,这将立即加载整个树,这可能需要一些时间。当用户打开子节点时,我该怎么做以实现按需加载? 提前致谢。 问题答案: Irishka向我指出了正确的方向,但并不能完全解决我的问题。我在弄弄她的答案,然后想到了这个。仅为了清楚起见,使用了两个不同的服务器功能。第

  • 扩展说明 从多个服务提者方中选择一个进行调用 扩展接口 org.apache.dubbo.rpc.cluster.LoadBalance 扩展配置 <dubbo:protocol loadbalance="xxx" /> <!-- 缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配置 --> <dubbo:provider loadbalance="xxx"

  • 说明 本部分说明如何在现有的机器中添加一个新的计算节点。添加节点之前,OpenShift 共有四个节点,1 个 master,1 个 infra,2 个 nodes,如下命令所示: # oc get nodes NAME STATUS ROLES AGE VERSION infra.example.com Ready infr

  • 扩展说明 扩展点本身的加载容器,可从不同容器加载扩展点。 扩展接口 org.apache.dubbo.common.extension.ExtensionFactory 扩展配置 <dubbo:application compiler="jdk" /> 已知扩展 org.apache.dubbo.common.extension.factory.SpiExtensionFactory org.a

  • 我有一个Azure应用服务,其中我使用应用服务计划横向扩展选项创建了5个实例。现在我不确定Azure负载如何平衡此实例之间的请求?我没有看到任何负载均衡器。 还有,我如何知道哪个实例正在处理哪个请求?

  • 我有一个问题加载我的扩展在PHP在windows 7.我已经在我的windows上安装了php和IIS,当我检查phpinfo()页面时,我发现我的extension_dir是c:/php/exts。所以我将我的dll文件复制到那个目录中,并添加php.ini文件,然后我重启IIS并检查我的扩展名是否已加载: 但每次我运行这段代码时都会得到“否”。谢谢你的帮助。