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