ExtJS 4 - 获取作为给定元素后代的所有组件

时间:2011-12-06 14:33:43

标签: dom extjs extjs4 dom-traversal

查找作为给定HTML元素的后代呈现的所有ExtJS组件的最有效方法是什么?请注意,此Element不是组件本身的一部分,并且不以任何方式由Ext管理,它只是硬编码的原始HTML。而且这个元素可能不仅仅包含ext组件,它也可能包含其他非ext管理的html,并且html也可以包含ext组件。这意味着解决方案必须一直遍历DOM,而不仅仅是直接看孩子。

1 个答案:

答案 0 :(得分:2)

我的建议是走dom,检查每个元素的id对Ext.getCmp,这是一个哈希映射查找。然后你可以切换到走Component方法,但我认为它基本上是相同的速度,如果你已经开始走dom,你可以坚持下去:

var dom = ...;
var components = [];
Ext.Array.each(Ext.get(dom).query('*'), function(dom) {
  var cmp = Ext.getCmp(dom.id);
  if (cmp)
    components.push(cmp);
});

Ext.get(dom).query('*')可能比你想做更多的工作,拥有自己的助行器可能更有效率,如下所示:

function walk(dom, callback) {
  if (dom.nodeType === 1) {
    callback(dom);
    Ext.Array.each(dom.childNodes, function(child) {
      walk(child, callback);
    });
  }
}
var dom = ...;
var components = [];
walk(dom, function(dom) {
  var cmp = Ext.getCmp(dom.id);
  if (cmp)
    components.push(cmp);
});

所有这些都假设dom id与组件ID匹配,我不知道在未来的Ext版本中是否可以依赖它。