0

我正在尝试使用 ExtJS 4 从我的页面中查找特定元素,以便对其进行修改。我知道它的 id 所以它不应该是一个问题但是

-我尝试了 Ext.getCmp('theId') 它只是返回给我undefined

-我尝试通过视图使用 down('theId') 方法,但仍然得到null响应。

正如我知道元素的 id 一样,我通过手动设置 id 再次尝试了这两种方法,但它也不起作用。

这两种方法都不起作用吗?

我应该怎么做?

这是代码的相关部分:

listeners: {
                load: function(node, records, successful, eOpts) {
                    var ownertree = records.store.ownerTree;
                    var boundView = ownertree.dockedItems.items[1].view.id;
                    var generalId = boundView+'-record-';
                    // Add row stripping on leaf nodes when a node is expanded
                    //
                    // Adding the same feature to the whole tree instead of leaf nodes
                    // would not be much more complicated but it would require iterating
                    // the whole tree starting with the root node to build a list of
                    // all visible nodes. The same function would need to be called
                    // on expand, collapse, append, insert, remove and load events.
                    if (!node.tree.root.data.leaf) {
                        // Process each child node
                        node.tree.root.cascadeBy(function(currentChild) {
                            // Process only leaf
                            if (currentChild.data.leaf) {
                                var nodeId = ""+generalId+currentChild.internalId;
                                var index = currentChild.data.index;
                                if ((index % 2) == 0) {
                                    // even node
                                    currentChild.data.cls.replace('tree-odd-node', '')
                                    currentChild.data.cls = 'tree-even-node';
                                } else {
                                    // odd node
                                    currentChild.data.cls.replace('tree-even-node', '')
                                    currentChild.data.cls = 'tree-odd-node';
                                }
                                // Update CSS classes
                                currentChild.triggerUIUpdate();
                                console.log(nodeId);
                                console.log(ownertree.view.body);
                                console.log(Ext.getCmp(nodeId));
                                console.log(Ext.getCmp('treeview-1016-record-02001001'));
                                console.log(ownertree.view.body.down(nodeId));
                                console.log(ownertree.view.body.down('treeview-1016-record-02001001'));
                            }
                        });
                    }
                }

你可以在最后看到我的 console.log。这是他们在 javascript 控制台上给我的内容(按正确的顺序):

treeview-1016-record-02001001

我正在寻找的确切身份。我也手动尝试以防万一......

h {dom: table#treeview-1016-table.x-treeview-1016-table x-grid-table, el: h, id: "treeview-1016gridBody", $cache: Object, lastBox: Object…}

我检查了这个项目的每个配置及其 dom,它正是我正在寻找的 dom 的一部分,它是包含我的树的视图。大父母

接着:

undefined
undefined
null
null

这是我要访问的项目:

<tr role="row" id="treeview-1016-record-02001001" ...>

我检查了任何地方都没有 id 重复...

我问过其他人,他们告诉我这些方法不起作用。问题是我需要访问这个项目来修改它的 cls。

我会很感激任何想法。

4

2 回答 2

1

您正在寻找Ext.get(id). Ext.getCmp(id)用于Ext.Components,Ext.get(id)用于Ext.dom.Elements。请参阅此处的文档:http ://docs.sencha.com/extjs/4.2.1/#!/api/Ext-method-get

于 2013-07-12T14:55:27.327 回答
0

好的,最后我使用了afteritemexpand监听器。Ext.get(id)使用 ids,我可以通过您的方法 kevhender获得我正在寻找的元素:)。原因是当我使用我的加载侦听器(它只是商店)时,dom 元素没有完全加载,因此该Ext.get(id)方法无法正确获取元素。我第一次使用afterlayout侦听器,这是正确的,但经常被调用,并且访问 id 并不那么容易。所以,这就是我最终的做法:

listeners: {
                load: function(node, records, successful, eOpts) {
                    var ownertree = records.store.ownerTree;
                    var boundView = ownertree.dockedItems.items[1].view.id;
                    var generalId = boundView+'-record-';

                    if (!node.tree.root.data.leaf) {
                        // Process each child node
                        node.tree.root.cascadeBy(function(currentChild) {
                            // Process only leaf
                            if (currentChild.data.leaf) {
                                var nodeId = ""+generalId+currentChild.internalId;
                                var index = currentChild.data.index;
                                if ( (index % 2) == 0 && ids.indexOf(nodeId) == -1 ) {
                                    ids[indiceIds] = nodeId;
                                    indiceIds++;
                                } 
                               console.log(ids);
                            }
                        });
                    }
                },
                afteritemexpand: function( node, index, item, eOpts ){

                    /* This commented section below could replace the load but the load is done during store loading while afteritemexpand is done after expanding an item.
                     So, load listener makes saving time AND makes loading time constant. That is not the case if we just consider the commented section below because
                     the more you expand nodes, the more items it will have to get and so loading time is more and more important
                    */

//                      var domLeaf = Ext.get(item.id).next();
//                      for ( var int = 0; int <     node.childNodes.length; int++) {
//                          if (node.childNodes[int].data.leaf && (int % 2) == 0) {
//                                  if (ids.indexOf(domLeaf.id) == -1) {
//                                      ids[indiceIds] = domLeaf.id;
//                                      indiceIds++;
//                                  }
//                          }
//                          domLeaf = domLeaf.next();
//                      }
                    for ( var int = 0; int < ids.length; int++) {
                        domLeaf = Ext.get(ids[int]);
                        if (domLeaf != null) {
                            for ( var int2 = 0; int2 < domLeaf.dom.children.length; int2++) {
                                if (domLeaf.dom.children[int2].className.search('tree-even-node') == -1){
                                    domLeaf.dom.children[int2].className += ' tree-even-node';
                                }
                            }
                        }
                    }
                },

使用ids其中的一个Array我需要设置类。

谢谢你的方法。

于 2013-07-15T13:30:10.707 回答