проверять дочерние узлы дерева при щелчке по родительскому элементу [ExtJS] - PullRequest
9 голосов
/ 16 февраля 2010

Я хотел бы знать, как я могу проверить узлы-узлы дерева при нажатии на конкретный узел в ExtJ.

Я дал идентификаторы для каждого узла, и я могу получить доступ к идентификатору выбранного узла. тогда как я могу перейти к автоматической проверке дочерних узлов ??

кто-нибудь, пожалуйста, помогите мне ..

Ответы [ 7 ]

7 голосов
/ 16 февраля 2010
// or any other way of getting hands on the node you want to work with
var node = treePanel.getNodeById('your-id');
node.eachChild(function(n) {
    n.getUI().toggleCheck(true);
});

Если вы хотите, чтобы это работало на всем поддереве текущего узла, вам придется выполнить некоторую рекурсию.

Немного более интегрированный:

treePanel.on('checkchange', function(node, checked) {
    node.eachChild(function(n) {
        n.getUI().toggleCheck(checked);
    });
});
5 голосов
/ 20 сентября 2010
function nodeCheck(node) {
    node.eachChild(function(n) {
        if(n.hasChildNodes())
            nodeCheck(n)
        n.getUI().toggleCheck(false);
    });
}
var node = (tree.getSelectionModel().getSelectedNode()) ? tree.getSelectionModel().getSelectedNode() : tree.root;
if(node) nodeCheck(node);

У меня хорошо работает;)

2 голосов
/ 30 декабря 2011

слушателей: {

checkchange : function(node, checked) {
    node.parentNode.cascadeBy(function(n){n.set('checked', checked);});
}

}

1 голос
/ 20 сентября 2013

Ответ Mr C работает нормально (ExtJS 4.2), но ошибка возникает, когда дочерние узлы родительского узла имеют 1 дочерний элемент. Вот мое небольшое улучшение. Кто-то может улучшить дальше

function (node, checked) {

    if (node.isLeaf()) {
        node = node.parentNode;
        var siblingStateEqual = true;
        if (node.childNodes.length == 1) {
            siblingStateEqual = checked;
        } else {
            node.cascadeBy(function (n) {
                if (n != node) {
                    if (n.get('checked') != checked) {
                        siblingStateEqual = false;
                    }
                }

            });
        }

        if (siblingStateEqual == checked) {
            node.set('checked', checked);
        }

    }
    else {
        node.cascadeBy(function (n) {
            n.set('checked', checked);
        });
    }
}
1 голос
/ 31 августа 2012
function checkChange(node, checked, Object) {
    node.cascadeBy(function(n) {
        n.set('checked', checked);
    });
}
0 голосов
/ 20 февраля 2013

Или, если, как и я, вам нужно автоматически проверять / снимать флажок родительского узла, когда все дочерние конечные узлы отмечены / сняты, вы можете попробовать это:

function (node, checked)
{

    if (node.get('leaf'))
    {
        node = node.parentNode;
        var siblingStateEqual = true;
        node.cascadeBy(function (n)
        {
            if (n != node) {
                if (n.get('checked') != checked) {
                    siblingStateEqual = false;
                }
            }

        });

        if (siblingStateEqual == checked)
        {
            node.set('checked', checked);
        }

    }
    else
    {
        node.cascadeBy(function (n) { n.set('checked', checked); });
    }


}
0 голосов
/ 08 сентября 2010

При заполнении узлов JSON или XML понадобится установить свойство true для «true» или «false». Я предполагаю, что вы используете AsyncTreeNode, чтобы сделать это для вас. Если узлы дерева созданы без наличия этого отмеченного свойства, ExtJS не будет отображать его с флажком.

...