2013-07-12 6 views
0

Я пытаюсь найти конкретный элемент на своей странице с помощью ExtJS 4, поэтому я могу внести в него изменения. Я знаю, что его идентификатор, так что не должно быть проблемой, НОПопытка работать с методом down() из ExtJS 4.2.1

-I попытался Ext.getCmp («theId»), и он просто вернуть мне undefined

-I пытался использовать метод вниз («») theId пройдя через представление, и я все еще получаю ответ null.

Как я знаю идентификатор элемента, я попробовал повторить два метода, установив вручную идентификатор, и он тоже не работает.

Эти два метода не работают?

Как мне это сделать?

Здесь заинтересованная часть кода:

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…} 

Я проверил каждый конфиги этого пункта и его йота, и это именно та часть йота Ищу, что вид, содержащий мое дерево. BIG родитель

И потом:

undefined 
undefined 
null 
null 

Вот пункт, который я хочу, чтобы получить доступ к:

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

И я проверил нет дублирования идентификатора в любом месте ...

I спросил кто-то еще, кто сказал мне, что эти методы не работают. Проблема в том, что мне нужно получить доступ к этому элементу, чтобы изменить его cls.

Буду признателен за любую идею.

ответ

1

Вы ищете Ext.get(id). Ext.getCmp(id) используется для Ext.Component s, а Ext.get(id) используется для Ext.dom.Element s. См. Документы здесь: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext-method-get

+0

Кажется, это правильный метод. Он эффективно находит элемент из dom, а не компонент. Но это не работает в моем случае, поэтому я полагаю, что есть проблема где-то ... Я собираюсь попробовать что-то и сообщить вам – Poney

+0

Хорошо, что все работает. Я добавил слушателя itemclick на моем дереве, чтобы выполнить 'console.log (Ext.get ('treeview-1016-record-02001001'));' когда я нажимаю, и он возвращает мне правильный элемент, поэтому я думаю, что мое дерево не полностью загружен, когда я пытаюсь выполнить свои первые строки 'Ext.get (id)'. Теперь я знаю, как это сделать! Спасибо, кев – Poney

0

Хорошо, наконец, я использовал слушателя afteritemexpand. С идентификаторами я получаю элементы, которые я ищу, с помощью метода Ext.get(id) kevhender :). Причина в том, что элементы dom, где не полностью загружены, когда я использовал загрузчик загрузки (это был только магазин), поэтому метод Ext.get(id) не смог правильно получить элемент. Я сначала использовал afterlayout прослушиватель, это было правильно, но слишком часто вызывалось, и доступ к идентификатору был не таким простым. Итак, вот как я, наконец:

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 НМД мне нужно установить класс.

Благодарим вас за метод.