Kendo Treeview扩大大树问题

我使用kendo创建了一个树控件TreeView.it拥有超过10,000个节点,并且在创建树时我使用了loadOnDemand false。 我提供了一个功能来扩展树的级别,因为我创建了一个方法,它将参数“level”作为数字并相应地展开,用户可以在该方法中输入15(最大级别),它可以正常工作所有级别都有500到600个节点,但是当树有超过5000个节点时,如果用户试图扩展到第二级节点之上,那么浏览器挂起并显示没有响应的错误。

我为扩展树而创建的方法是: -

function ExapandByLevel(level, currentLevel) {
  if (!currentLevel) { 
    currentLevel = 0;
  }
  if (level != currentLevel) {
    var collapsedItems = $("#treeView").find(".k-plus:visible"); 
    if (collapsedItems.length > 0) {
        setTimeout(function () {
            currentLevel++;

            var $tree = $("#treeView");
            var treeView = $tree.data("kendoTreeView");

            var collapsedItemsLength = collapsedItems.length;
            for (var i = 0; i < collapsedItemsLength; i++) {
                treeView.expand($(collapsedItems[i]).closest(".k-item"));
            }
            ExapandByLevel(level, currentLevel);
        }, 100);
    }
    else {
        //console.timeEnd("ExapandByLevel");
        hideLoading();
    }
  }
  if (level == currentLevel) {

    hideLoading();
  }
}

调用上面给出的方法,如下所示: -

ExapandByLevel(15);

这里15级是在树中扩展。

当树有超过5000个节点时,如果用户试图扩展到二级节点之上,那么浏览器挂起并显示没有响应的错误。 请建议任何方式来做到这一点,我想要的是展开可以包含超过5000个节点的树。


当我想加载一棵有30,000个节点的树时,我遇到了类似于Kendo TreeView的问题。 即使在loadOnDemand设置为true时,浏览器也会冻结很长时间才能加载这些节点。

所以我们决定实现扩展节点的服务器端功能,这就是你应该做的。 您需要对现有代码进行2处更改。

  • 更改你的树使用服务器端的Expand方法。
  • 当您调用扩展时,应确保节点已扩展。
  • 下面将解释这两个步骤。 你应该知道的是,这样你的浏览器根本不会挂起,但是可能需要一些时间来完成操作,因为会有这么多web服务调用服务器。

  • 更改您的树以使用服务器端扩展方法:
    请在这个链接中看到Kendo UI的绑定到远程数据的演示。 请注意, loadOnDemand应设置为true 。 另外,服务器端Expand Web服务也应该实现。

  • 当您调用扩展时,您应该确保该节点已扩展:
    为了做到这一点,应该在Kendo UI TreeView中定义一个像Expanded这样的事件,但不幸的是除了Expanding事件之外没有其他事件。 在这种情况下使用setTimeout是不可靠的,因为网络不可靠。 所以我们最终使用while语句来检查节点的子节点是否被创建。 对此可能有更好的解决方案,但这符合我们目前的要求。 以下是扩展节点时应做的更改:

    if (collapsedItems.length > 0) {
        currentLevel++;
    
        var $tree = $("#treeView");
        var treeView = $tree.data("kendoTreeView");
    
        var collapsedItemsLength = collapsedItems.length;
        for (var i = 0; i < collapsedItemsLength; i++) {
            var node = $(collapsedItems[i]).closest(".k-item")
            if (!node.hasChildren)
                continue; // do not expand if the node does not have children
            treeView.expand(node);
            // wait until the node is expanded
            while (!node.Children || node.Children.length == 0);
        }
        ExapandByLevel(level, currentLevel);
    }
    
  • 您也可以以并行方式执行展开调用,以减少加载时间,但是您应该更改检查所有节点是否展开的方式。 我在这里写了一个示例代码,应该可以正常工作。

    希望这可以帮助。


    解决您的问题非常简单:更新您使用的Kendo UI的版本,因为他们已经为HierarchicalDataSourceTreeView优化了(a loooooooooot)代码。

    检查这个:http://jsfiddle.net/OnaBai/GHdwR/135/

    这是您的代码,我已将kendoui.all.min.js的版本更改为v2014.1.318。 我甚至没有改变CSS(尽管你应该)。 你会看到打开这5000个节点的速度非常快。

    尽管如此,如果你去10000个元素,你很可能会认为它很慢,但很抱歉挑战你:你真的认为10000个节点树是用户友好的吗? 树是呈现如此大量数据的正确方式吗?

    链接地址: http://www.djcxy.com/p/80483.html

    上一篇: Kendo Treeview Expanding big tree issue

    下一篇: App with jailbreak detection rejected by Apple