주어진 HTML 요소의 하위 항목으로 렌더링되는 모든 ExtJS 구성 요소를 찾는 가장 효율적인 방법은 무엇입니까? 이 요소는 구성 요소 자체의 일부가 아니며 어떤 식 으로든 Ext에서 관리하지 않으며 원시 HTML로 하드 코딩됩니다. 그리고이 요소는 단지 ext 구성 요소를 포함 할뿐만 아니라 그 안에 다른 non-ext 관리 html을 가질 수 있으며 html에는 ext 구성 요소가 포함될 수 있습니다. 따라서 솔루션은 직접적인 어린이를 바라 보는 것뿐만 아니라 DOM을 따라 이동해야합니다.ExtJS 4 - 지정된 요소의 자손 인 모든 구성 요소 가져 오기
2
A
답변
2
제 제안은 각 요소의 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 Extensions의 미래 버전에 의지 할 수 있습니다.
DOM id가 ID와 일치하는 것은 사실이지만, 다른 모든 문제가 있다고하더라도 변경된 것은 사실입니다. 필자는 이것에 대해 좀더 생각해 보았고, Ext.ComponentManager.all을 반복하면서'Ext.Element.contains()'[link] (http://docs.sencha.com/ext- js/4-0/#!/api/Ext.Element-method-contains)를 사용하여 각 요소의'.getEl()'결과가 주어진 요소에 포함되어 있는지 확인하십시오. 이 방법은 당신이 제안한 것보다 덜 효율적입니까? –
효율성이 다를 수 있습니다. 반드시 나쁜 것은 아니지만 아마도 더 나빠질 것입니다. 각 구성 요소에 대해 여러 요소를 반복합니다. DOM 트리의 깊이가 M이고 구성 요소의 수가 N 인 경우 O (M * N)과 같아야합니다. 내가 제안한 방법은 O (X)와 같습니다. 여기서 X는 DOM 요소의 수입니다. 어떤 방법이 더 빠를지 일반화하기는 어렵지만, (a) Ext가 페이지의 게시물을 관리하고 있고 (b) 페이지에 많은 요소가있는 경우 dom 도보가 더 빠를 것입니다 . –
도움이되어 주셔서 감사합니다. –