0

プロジェクトで遅延読み込みを使用して dynatree を使用しようとしていました。選択機能とチェックボックスを組み合わせてモード 3 を選択しようとしたとき、モード 3 の選択ルールが、親が選択されているときに子を含むすべての子を選択することに失望しました。これは、子がまだロードされていないためです。

これを機能させるための回避策はありますか?どんな提案でも大歓迎です。ザンクや!!

4

2 に答える 2

0

選択した親の子を追加するときは、親に子があるかどうかを確認してください。TRUE の場合、各子を追加し、それらの各子を選択済みに設定します。

以下にいくつかのコードを示します。onLazyRead上に上がります。遅延ノードをクリックするたびに、この関数がトリガーされます。この関数内には、選択したノードの子データを取得する関数の呼び出しが含まれている必要があります。

以下のコードは、この問題を解決した方法です。行っているほとんどのことは、追加するノードの親が選択されているかどうかを確認することです。TRUE の場合、ノードを追加してから追加します.select()

すべてのノードがすでにロードされているため、ノードの選択を解除する場合は、これがはるかに簡単になります。選択を解除するときは、選択を解除するノードからツリーの階層を下って、各ノードのチェックを外すだけです。

これは大量のコードであることは承知していますが、アイデアを理解していただければ幸いです。できない場合は、仕事中にこのスレッドに戻って確認しようとします。たぶん、あなたが今までに持っているものを投稿することさえできますか?

onLazyRead: function(node){

jQuery("#tree2").dynatree("getTree").disable();

        var pParentID = node.data.key;          

                    //Select the Node

        doChildReport(pParentID); //Get Children for this node's ID

    },


///....
//Methods to grab data from a "XMLHttpRequest GET" go here
//....

//When you finally want to add the children that you fetched using the ID of the node you selected...

//treeArray is an array of node data that has been parsed out of a 
//string returned by a "XMLHttpRequest GET"

//Contents of array in order, repeating: treeArray[0] = ParentID, [1] = nodeID [2] = nodeName
//Example, the array would return [111], [222], ["Child Node"]


if(){ //IF Next fetched node is on the last level, ie. no children
            //add normally
        }
    else{  //If NOT, add lazy.
        if(treeArray[1] != "nill" && treeArray[1] != undefined){

        //IF THE PARENT NODE IS SELECTED
        if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[0]).isSelected() == true){

        //AND IF the child node does not exist
        if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){

            //Add the child node and then mark it selected
            addChildNodeLazy(treeArray[1], treeArray[2], treeArray[0]);
            jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]).select();
        }   
        }else{
            if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
                addChildNodeLazy(treeArray[1], treeArray[2], treeArray[0]);
            }
        }
    }
}

遅延ロード機能...

function addChildNodeLazy(NodeID, NodeName, ParentID){
        jQuery("#tree2").dynatree("getTree").getNodeByKey(ParentID).addChild({title: NodeName, key: NodeID, icon: false, isFolder: true, isLazy: true});
    }
于 2012-10-17T13:07:25.603 に答える
0

確かに、以下は少しハックです...しかし、この問題は解決します:

onSelect: function (flag, node) {
    if (flag && node.childList == undefined) {
        node.reloadChildren(function() {
            node.select(false);
            node.select(true);
        });
    }

ノードが選択されている (flag == true) かつノードがまだロードされていない (childList == undefined) 場合は、コールバック関数を使用して reloadChildren を呼び出します。コールバックはデータがロードされた後に実行され、チェックボックスのオン/オフを切り替えるだけです。これにより、すべての子ノード (現在存在する) が選択されます。

于 2013-03-01T06:29:15.790 に答える