проверять дочерние узлы дерева при нажатии родителя [ExtJS]

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

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

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


person tismon    schedule 16.02.2010    source источник


Ответы (7)


// 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);
    });
});
person Stefan Gehrig    schedule 16.02.2010
comment
не работает в новых версиях API. удалось это stackoverflow.com/questions/6579769/ - person pahan; 25.10.2011
comment
Это правильно. Приведенный выше код предназначен для Ext JS 3, Ext JS 4 довольно сильно изменил API-интерфейс дерева. - person Stefan Gehrig; 25.10.2011
comment
Поэтому, если вы не расширите дочерние узлы, они не будут загружаться. Поэтому, когда вы вызываете checkchange, он будет проверять только загруженные дочерние узлы. В итоге я добавил node.expand(true); перед node.eachChild, поэтому он расширяет все узлы и затем проверяет их все. - person Grammin; 19.08.2013
comment
У меня следующая ошибка: Превышен максимальный размер стека вызовов - person Cesar Miguel; 27.10.2014

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);

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

person slammer    schedule 20.09.2010
comment
Работайте нормально! По крайней мере, в Chrome у меня нет следующей ошибки: превышен максимальный размер стека вызовов =) - person Cesar Miguel; 27.10.2014

слушатели: {

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

}

person damo    schedule 30.12.2011

Ответ г-на 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);
        });
    }
}
person daniel    schedule 20.09.2013

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

person It Grunt    schedule 08.09.2010

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

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); });
    }


}
person Fred Dump    schedule 20.02.2013

person    schedule
comment
Некоторое краткое объяснение было бы полезно. - person Andrew Barber; 06.10.2012