2011-10-18 7 views
0

私は "スクリプトが応答しない"というエラーが出るので、かなり大きなツリーでこれを高速化する方法があるのだろうかと疑問に思っていましたか?それを解析するより良い方法はありますか?現在、ツリーは4レベル深いです。Telerik RadTreeViewとクライアント側の展開/折りたたみ

ありがとうございました。

+0

あなたもコードを投稿できますか? –

+0

特別なことは何もありません。本質的にプログラマブルに、サーバ側から4レベルの621ノードを作成します。クライアントからは、コードはまさに上記のリンクにあります。 –

+0

あなたはすでにサーバー上にノードをプログラム的に作成しているので、すべてのノードをサーバー側で拡張しようとしましたか?実際のところヒットしてはならないし、ここではもっと良い選択肢かもしれません。このような場合、私のマシンでの同様のテストがうまくいくので、あなたの特定の実装に固有のものがあるかもしれません。これをソリューションに分けてTelerikのサポートチケットに提出することが最善の策です。 – carlbergenhem

答えて

1

私は、ツリーを非同期に拡大したり折りたたんだりすることで、 "スクリプトが応答しない"というエラーに遭遇しました。さらに、私は下から展開して(ノードが拡大するのを見ることができます)、上から崩壊しますが、各ブランチの最後のノードに到達したときに限り、視覚的にはユーザーにとってははるかに面白いです。彼らは実際にそれが起こるのを見ることができます。速くない場合(IE7以前は特に遅いですが)、待っている間は少なくとも面白いです。

var treeView, nodes; 

function expandAllNodesAsynchronously() { 
    if (<%= expandedLoaded.ToString().ToLower() %>) { 
     treeView = $find("<%= tv.ClientID %>"); 
     nodes = treeView.get_allNodes(); 
     if (nodes.length > 1) { 
      doTheWork(expandOneNode, nodes.length); 
     } 
     return false; 
    } else 
     return true; 
} 

function expandOneNode(whichNode) { 
    var actualNode = nodes.length - whichNode; 
    if (nodes[actualNode].get_nextNode() == null) { 
     nodes[actualNode].get_parent().expand(); 
    } 
} 

function collapseAllNodesAsynchronously() { 
    treeView = $find("<%= tv.ClientID %>"); 
    nodes = treeView.get_allNodes(); 
    if (nodes.length > 1) { 
     doTheWork(collapseOneNode, nodes.length); 
    } 
} 

function collapseOneNode(whichNode) { 
    if (nodes[whichNode].get_nextNode() == null && nodes[whichNode].get_parent() != nodes[0]) { 
     nodes[whichNode].get_parent().collapse(); 
    } 
} 

function doTheWork(operation, cycles) { //, callback 
    var self = this, // in case you need it 
     cyclesComplete = 1, 
     batchSize = 10; // Larger batch sizes will be slightly quicker, but visually choppier 

    var doOneBatch = function() { 
     var c = 0; 
     while(cyclesComplete < cycles) { 
      operation(cyclesComplete); 
      c++; 
      if(c >= batchSize) { 
       // may need to store interim results here 
       break; 
      } 
      cyclesComplete++; 
     } 
     if (cyclesComplete < cycles) { 
      setTimeout(doOneBatch, 1); // "1" is the length of the delay in milliseconds 
     } 
     else { 
      // Not necessary to do anything when done 
      //callback(); // maybe pass results here 
     } 
    }; 

    // kickoff 
    doOneBatch(); 
    return null; 
}; 
1

yourtreeViewInstance.get_nodes()でノードを取得し、次に子ノードをeachChildNode.get_nodes()というように階層を下にして開始します。

次に、展開する各ノードで.set_expanded(true);を呼び出して、各アイテムを展開できます。

関連する問題