4

アプリケーションで jQuery の dynaTree を使用しています。親ノードが選択されたときに、すべての子ノードをプログラムで選択したいと考えています。私のツリーの構造は次のとおりです

<div id = "tree">
    <ul>
       <li>package 1
         <ul>
           <li>module 1.1
              <ul>
                <li> document 1.1.1</li>
                <li> document 1.1.2</li>
               </ul>
            </li>  
            <li>module 1.2
               <ul>
                 <li>document 1.2.1</li>
                 <li>document 1.2.2</li>
               </ul>
           </li>
        </ul>
     </li>
     <li> package 2
        <ul>
          <li> module 2.1
            <ul>
               <li>document 2.1.1</li>
               <li>document 2.1.1</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
</div> 

今私が欲しいのは、タイトルが「パッケージ1」のツリーノードをクリックすると、そのすべての子ノード、つまり(モジュール1.1、ドキュメント1.1.1、ドキュメント1.1.2、モジュール1.2、ドキュメント1.2.1、ドキュメント1.2.2)も選択する必要があります。

以下は、私が使用しようとしたアプローチです。

$("#tree").dynatree({
        onSelect: function(flag, dtnode) {
            // This will happen each time a check box is selected/deselected
            var selectedNodes = dtnode.tree.getSelectedNodes();
            var selectedKeys = $.map(selectedNodes, function(node) {

                //alert(node.data.key);
                return node.data.key;


            });
            // Set the hidden input field's value to the selected items
            $('#SelectedItems').val(selectedKeys.join(","));

            if (flag) {
                child = dtnode.childList;

                alert(child.length);
                for (i = 0; i < child.length; i++) {
                    var x = child[i].select(true);
                    alert(i);
                 }
            }
        },
        checkbox: true,
        onActivate: function(dtnode) {
            //alert("You activated " + dtnode.data.key);
        }


    });

このif(flag)状態で、ユーザーが選択した要素のすべての子ノードを取得すると、alert(child.length) ステートメントから確認できる正しい値が得られます。次に、ループを実行してすべての子を選択しますが、ループがステートメントを超えることはありませんvar x = child[i].select(true);

alert(i)そして、ステートメントが実行されているのを見ることはできません。上記のステートメントの結果は、パッケージ 1 を選択すると、モジュール 1.1 とドキュメント 1.1.1 も選択されますが、alert(i)ステートメントは実行されず、パッケージ 1 の他の子は選択されません。私の見解では、最初のchild[i].select(true)ステートメントが実行されると、その子の on select イベントもトリガーされ、再帰のようなものになります

私の考えは正しいですか?どんな再帰でも、一体何をしても、ループを完了せず、次の命令を実行しませんalert(i)

この問題を解決するのを手伝ってください。私はそのアラートを見て死にかけています。どんな提案や助けも大歓迎です。

4

3 に答える 3

3

ほとんどテストされていませんが、次のようなことを試すことができます。

$(function(){
    var inEventHandler = false;
    $("#tree").dynatree({
        checkbox: true,
        selectMode: 2,
        [...]
        onSelect: function(select, dtnode) {
            // Ignore, if this is a recursive call
            if(inEventHandler) 
                return;
            // Select all children of currently selected node
            try {
                inEventHandler = true;
                dtnode.visit(function(childNode){
                    childNode.select(true);
                });
            } finally {
                inEventHandler = false;
            }
        }
于 2010-05-16T10:29:08.957 に答える