2012-03-23 3 views
1

У меня есть набор контроллеров/представлений, которые составлены динамически, каждый из которых имеет список «селектор» и «контейнер», у такого контейнера может быть другая пара селекторов + контейнер и т. Д. Которые являются экземплярами одного и того же корневого селектора + контейнерного контроллера.Компонент ComponentQuery только для дочерних элементов

Это определение заголовок контроллера (абстрактный класс):

Ext.define('MyApp.controller.explorer.Base', { 
    extend: 'Ext.app.Controller', 
    refs: [ 
     {ref: 'explorerContainer', selector: '[itemId="explorerContainer]'}, 
     {ref: 'explorerSelector', selector: '[itemId="explorerSelector]'} 
    ], 

Дело в том, я не знаю, что должно быть селектор ComponentQuery, чтобы соответствовать только дочерние элементы моего контроллера с такими Itemid. Потому что, используя [itemId = "explorerContainer"], чтобы соответствовать компоненту, он делает это глобально, отвечая на самый верхний контейнер в дереве композиции.

В предыдущих экспериментах я сделал с ExtJS 3 я получил доступ к дочерним элементам с помощью myComponent.getComponent ('...'), но теперь нет getComponent(), и я не мог найти эквивалент в ExtJS 4.

Заранее спасибо.

ответ

7

Вы смешиваете бит контроллеры с представлениями в своем вопросе. Например, «дочерние элементы моего контроллера». Контроллер не является компонентом - просто наблюдателем событий. У детей есть дети и т. Д.

Вам нужно ознакомиться с классом Ext.ComponentQuery. Вы можете поэкспериментировать с ним в Firebug на вашем приложении или демонстрационных страницах. Вы просто открываете консоль firebug и введите Ext.ComponentQuery.query('panel') - затем замените панель на все, что вы считаете правильным, и проверьте ее. Если вы установите плагин Illuminations For Developers, вы получите компоненты Ext вместо общих объектов JS - это чрезвычайно полезно.

Документы имеют несколько примеров запросов: http://docs.sencha.com/ext-js/4-0/#!/api/Ext.ComponentQuery. Вы найдете символ «>», который ограничивает запрос для непосредственных детей.

Надеюсь, это поможет. Если вы не разместите еще какой-нибудь код, и мы сможем помочь вам создать несколько селекторов.

+0

Да, я смешанные контроллеры и представления, у меня есть MVC (MVP на самом деле) прошлое, и там контроллеры и представления всегда собрались вместе. Я понимаю оператор «>» в ​​синтаксисе селектора ComponentQuery, но это не работает, потому что оно глобально, и я не знаю заранее, насколько глубоки дети (подумайте о динамически создаваемом графическом интерфейсе). В моей композиции для представления я могу иметь Селекторы (S) и Контейнеры (C), составленные следующим образом: ViewPort (S, C (S, C (S, C (S, C (...))))) , – emaringolo

+0

Если вы не знаете глубину, вы просто используете «viewport mycontainer [property = value]» – dbrin

+0

Но что, если я не знаю, какое свойство отличается? Я не хочу отмечать каждый экземпляр, эта пара селекторов + контейнеров должна знать только о себе и быть в состоянии быть встроенной (дочерней) из всего остального и настолько глубокой, насколько это необходимо. Это обычный шаблон MVC/MVP, с которым я работал с Smalltalk с самого начала, просто я не знаю, как сделать то же самое в ExtJS4, но мой ответ ниже был тем, что я искал. – emaringolo

0

Чтение Ext.ComponentQuery документации Я нашел это в нижней части этого:

«Для облегчения доступа к запросам на основе от конкретного контейнера см Ext.container.Container.query, Ext.container. Container.down и Ext.container.Container.child. Также см. Ext.Component.up. "

Так Ext.container.ContainerView (xtype: контейнер) реализует ребенка ([селектор]), что ответ на первый дочерний элемент, соответствующий строковый аргумент селектора.

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.container.Container-method-child

Он делает именно то, что я искал.

+0

уверен, что методы вверх и вниз удобны. – dbrin

1

Вы можете просто выполнить компонент.query ('selector') для запроса поддерева, начинающегося с вашего компонента.