2

私は初心者のextJsユーザーです。チェックボックス付きのツリーパネルを使用していますが、子ノードがすべてチェックされていないときに親ノードのチェックを外したいです。以下は私のコードです。皆さんが私を助けてくれることを願っています。ここで何をすべきかわかりません。

私のツリーパネルの構造は次のようなものです:

  • 親ノード1
    • サブ親ノード 1.1
      • 子1.1
      • 子1.2
      • 子1.3
    • subparentNode1.2
      • child2.1
      • child2.2
  • 親ノード2
    • subparentNode2.1
      • child2.1.1


var treeCheck = new Ext.tree.TreePanel({
    //some code here
});

//event here

treeCheck.on('checkchange', function(node, checked) {
    if(node.hasChildNodes()==true) {

        node.eachChild(function(n) {
            n.getUI().toggleCheck(checked);
        });

    } else {

        if(!checked) {
            var _parentNode = node.parentNode;
            //i dont know what to do here...
            //specifically, i want to uncheck the parent node and subparent node
            //when the children/child node is unchecked
        }
    }
});
4

3 に答える 3

6

同じ問題がありました。このイベントハンドラーを追加して修正しました。

treePanel.on('checkchange', function(node, isChecked) {

    // Propagate change downwards (for all children of current node).
    var setChildrenCheckedStatus = function (current) {
        if (current.parentNode) {
            var parent = current.parentNode;
            current.set('checked', parent.get('checked'));
        }

        if (current.hasChildNodes()) {
            current.eachChild(arguments.callee);
        }
    };
    if (node.hasChildNodes()) {
        node.eachChild(setChildrenCheckedStatus);
    }

    // Propagate change upwards (if all siblings are the same, update parent).
    var updateParentCheckedStatus = function (current) {
        if (current.parentNode) {
            var parent = current.parentNode;

            var checkedCount = 0;
            parent.eachChild(function(n) {
                checkedCount += (n.get('checked') ? 1 : 0);
            });

            // Children have same value if all of them are checked or none is checked.
            var sameValue = (checkedCount == parent.childNodes.length) || (checkedCount == 0);

            if (sameValue) {
                var checkedValue = (checkedCount == parent.childNodes.length);
                parent.set('checked', checkedValue);
            } else {
                // Not all of the children are checked, so uncheck the parent.
                parent.set('checked', false);
            }

            updateParentCheckedStatus(parent);
        }
    }
    updateParentCheckedStatus(node);
});

下向き(ノードのすべての子をチェック)と上向き(ノードがチェックされていない場合は親ノードのチェックを外す)の両方の方法で再帰的に機能します。

于 2012-11-13T10:26:20.573 に答える
0
if(!checked)
{
    //To uncheck the child nodes (I think you didn't ask this)
    /*for(var i in node.childNodes)
        node.childNodes[i].set('checked', false);
    */
    //To unchek the parent node
    node.parentNode.set('checked', false);
    node.parentNode.parentNode.set('checked', false);
}

注: テストしたところ、再帰的ではないことがわかりました。

祖父母node.parentNode.set('checked', false)のチェックを外せばよかったのに。

于 2012-07-26T07:15:10.003 に答える