0

これがチェックされている場合、ノードのすべての子ノードをチェックしようとしています。

リスナーを追加しました

   tree.addListener('expandnode', this.onTreeNodeExpand, this);

関数

onTreeNodeExpand: function (node) {
       if (node.hasChildNodes()) {
            node.eachChild(function (n) {
                    var checked = n.parentNode.ui.isChecked();
                    if (checked != undefined && checked)
                    {
                            n.getUI().toggleCheck(checked);
                    }
            });
        }
    }

Async ツリー ノードがあるため、すべての子レコードがオンデマンドでロードされ、ノードが初めて展開されたときに、このステートメントに対して false になります。

if (node.hasChildNodes()) // false を返す

「 expandnode」だと思いますevent is called same time while Async is in progress

非同期データがロードされた後、このノードがチェックされているかどうかを確認し、すべての子ノードをチェック済みに設定するイベントをキャプチャするにはどうすればよいですか?

環境: EXTJS 3.4

4

2 に答える 2

0

このシナリオの EXTJS doc についてあまり助けが得られなかったので、以下のように処理しました。

子レコードの非同期呼び出しはすべて関数を通過します。データが読み込まれると、その ajax 成功関数で、親ノードに基づいてチェック ボックスを設定する別の関数を呼び出しました。

 ajaxForLoading: function (node, deep, anim, isDirectList, childrenConfig) {
       Ext.Ajax.request({
                    url: url,
                    params: param,
                    method: 'POST',
                    success: function (response) {
                       this.loadRelationNodeChildren(node, json, deep, anim, childrenConfig);
                    }

 },
loadRelationNodeChildren: function (node, json, deep, anim, childrenConfig){
    // My other logic
    expandChildNodes(node, this);
 },

expandChildNodes: function(node, scope){
 var checked = node.ui.isChecked();
            node.eachChild(function (n) {
                if (checked != undefined) {
                    var tree = n.ownerTree;
                    if (n.isLeaf())
                        tree.suspendEvents();
                        n.getUI().toggleCheck(checked);
                    if (n.isLeaf())
                        tree.resumeEvents();
                }
            });

}
于 2015-01-08T21:44:15.563 に答える
0

「beforechildrenrendered」、「expand」、「checkchange」イベントを使用して、チェック ノードと非同期ツリーを切り替えます。

root: {nodeType: 'async',text: 'root', id:'-1'},
dataUrl: url,
listeners: {
    scope: this,
    'beforechildrenrendered': function(node) {
        node.eachChild(function(childNode) {
            childNode.on('checkchange', function(node, checked) {
                childNode.suspendEvents();//need suspend events first
                childNode.cascade(function(n) {
                    n.attributes.checked = checked;
                    n.getUI().toggleCheck(checked);
                });
                childNode.resumeEvents();//resume events

                if(!checked) {
                    return;
                }

                if(!node.isLeaf()) {
                    node.expand();
                }
            });
        },this);

        node.on('expand', function(node) {
            if(node.id == '-1') {//root
                return;
            }

            if(node.parentNode && node.parentNode.attributes.checked) {
                node.attributes.checked = true;
                node.getUI().toggleCheck(true);
            }

            if(node.attributes.checked) {
                for(var i = 0; i < node.childNodes.length; i++) {
                    node.childNodes[i].expand();
                }
            }
        });
    }
}
于 2016-08-08T07:43:57.887 に答える