Extjs 在树中动态更改节点渲染

Extjs 在树中动态更改节点渲染,extjs,extjs4.2,Extjs,Extjs4.2,当我调用Ext.tree.Panel时,我想渲染一些任意节点 比方说,当我单击一个节点时,我想将其所有子节点高亮显示为黄色: 简单 我知道如何渲染单击的节点。这很简单: itemclick: function(dv, record, item, index, e) { //HTMLElement item.style.color="RED"; 项目只是一个HTMLElement,可以更改其样式 我还设法弄明白,我也可以像这样从商店访问数据: itemclick: funct

当我调用Ext.tree.Panel时,我想渲染一些任意节点

比方说,当我单击一个节点时,我想将其所有子节点高亮显示为黄色:

简单

我知道如何渲染单击的节点。这很简单:

itemclick: function(dv, record, item, index, e) {

    //HTMLElement
    item.style.color="RED";
项目只是一个HTMLElement,可以更改其样式

我还设法弄明白,我也可以像这样从商店访问数据:

itemclick: function(dv, record, item, index, e) {

    //View --> store
    dv.store.data.items[4]
数据项就是我认为的Ext.data.Model对象。我看不到任何可以向项目对象添加样式的挂钩,但是:(

我还查看了执行“向上”查询并在树面板上调用findChild(…)

itemclick: function(dv, record, item, index, e) {


    //Ext.data.NodeInterface
    var panel = dv.up('panel');
    var rn = panel.getRootNode();

    var r = rn.findChild("name", "MYNODE");

    r.data.cls = 'my_class';
有一个cls“钩子”,我可以在其中设置类值。但是呈现似乎没有发生。而且findChild方法只返回一个值,并且没有findChildren(这真是令人困惑。ExtJS为什么会这样做?)

这个事件回调方法真的让我很困惑。不知何故,我需要在HtmleElement和数据项或存储之间建立一个链接。所有这些方法似乎都会给我带来死胡同

更新:
在第三个示例中,我可以调用panel.getView().refresh();这将更新UI。因此,现在我唯一的问题是找到一个类似getChildren(..)的方法。如果您正在寻找获取子节点的方法,那么下面的代码可能会对您有所帮助

   var nodeRef = this.items.items[0]   //this will give you the first root node.
   var node = nodeRef.node;
   var childrenNodes = node.childNodes;
上面(在上面的代码中,这是指您的树面板)将为您提供直接的子节点。
希望这对您有所帮助。也可以从sencha论坛上查看一下。

我通过先获取面板,然后获取根节点来解决问题。然后在根节点上调用eachChild()函数

我需要传入一个递归函数。这个递归函数查找我感兴趣的节点(使用searchTerm),然后它可以设置一个cls值。最后,我运行panel.getView().refresh(),,这一切都非常有效

itemclick: function (dv, record, item, index, e) {



    var panel = dv.up('panel');
    var rn = panel.getRootNode();

    var traverseTree = function (c) {

        if (c.data.name == traverseTree.searchTerm) {
            c.data.cls = 'myClass';
        }else {
            c.data.cls = '';
        }

        if (c.childNodes.length > 0) {

            for (var i = 0; i < c.childNodes.length; i++) {

                var node = c.childNodes[i];

                traverseTree(node)
            }
        }
    };

    traverseTree.searchTerm = "StringToMatch";
    rn.eachChild(traverseTree, rn);
    panel.getView().refresh();
itemclick:函数(dv、记录、项、索引、e){
var面板=dv.up(“面板”);
var rn=panel.getRootNode();
var traverseTree=函数(c){
if(c.data.name==traverseTree.searchTerm){
c、 data.cls='myClass';
}否则{
c、 data.cls='';
}
如果(c.childNodes.length>0){
对于(var i=0;i