2010-11-02 1 views
0

Я не уверен, что лучшая практика заключается в попытке «сделать что-то» с формой в результате взаимодействия с пользователем - я, безусловно, открыт для альтернатива, если это лучшая практика.Flex + MXML: Получение родительской формы из текстового поля «введите» событие

Существует свойство события MXML, называемое «enter», которое применяется к s: TextInput, который вызывает обработчик событий AS, когда пользователь нажимает клавишу Enter в поле TextInput (представьте поле поиска - введите тип поиска и нажмите Войти).

Теперь, в этом обработчике событий, мне нужно получить родительский объект формы. Поскольку мы говорим о лучших практиках здесь, мне не интересно ссылаться на форму по ID, если мой обработчик «ввода» должен иметь возможность работать с разными формами.

Мой вопрос: что является лучшим способом получить дескриптор родительской формы целевой цели в Flex? Иерархия parent-child в Flex абсолютно нелепо (например: FileSyncFB0.WindowedApplicationSkin2.Group3.contentGroup.TabNavigator7.NavigatorContent10.SkinnableContainerSkin11.contentGroup.Group17.Panel18.PanelSkin23._PanelSkin_Group1.contents.contentGroup.directoryForm_A.FormSkin32.contentGroup.FormItem34.FormItemSkin36 .contentGroup).

Серьезно.

Кто может это понимать?

В цепочке тарабарщин выше, объект, который я ищу, является directoryForm_A, но посмотрите, насколько он вложен! Несомненно, должно быть какое-то свойство FormItem, которое ссылается на его родительскую форму?

The MXML structure is much more meaningful semantically: 
<s:Form id="directoryForm_A" width="100%"> 
<s:FormItem width="100%" label="URI"> 
    <s:layout> 
    <s:BasicLayout/> 
    </s:layout> 
    <s:helpContent> 
    <s:Label text="Help String"></s:Label> 
    </s:helpContent> 
    <s:TextInput left="0" right="0" enter="handleUserSetRootDirectory(event)"/> 
</s:FormItem> 
</s:Form> 

TextInput инициирует событие и является event.target. Следуя моей иерархии MXML, логическая цепочка может быть event.target.parent.parent, отбирающая меня от TextInput до FormItem к форме, но, как вы можете видеть, прекрасная скин-архитектура Spark ставит все эти другие экранные объекты и контейнеры между ними.

Есть ли какая-то другая иерархия, которую я могу использовать, которая имеет гораздо более семантически чистую структуру для перемещения? Или есть встроенное свойство или метод FormItems (по крайней мере), которые позволяют вам обращаться к своим логическим родительским контейнерам?

Или я все еще думаю слишком много, как разработчик Flash/AS3, и есть другая парадигма, которую я должен просто поднять, чтобы мои джинсы приняли?

+0

Кстати, хотя ответ Робусто - настоящий Маккой, что я искал - более структурную иерархию, чем цепочку DisplayObject, - можно найти через UIComponent.owner. Поэтому, чтобы делать то, что я хотел (что не является лучшей практикой), вы бы сказали event.target.owner.owner. –

ответ

2

Вы не должны стараться ссылаться на event.target.parent.parent. Никогда не пытайтесь создать такую ​​ссылочную цепочку, так как она может измениться, и когда вы ее измените, она сломает вещи. Вместо этого у вас есть обработчик для TextInput, который обрабатывает событие ENTER и отправляет другое (возможно, настраиваемое) событие, которое прослушивается любым, на что ссылается event.target.parent.parent, будь то форма, контейнер или приложение. Если необходимо, пузырь событий. Затем сделайте все, что хотите, в , что обработчик.

+0

Спасибо за это. Вы абсолютно правы. Когда я работал над проблемой, я понял, что этот подход создает слишком тугую связь между представлением (Textfield и его родительской цепочкой) и контроллером (обработчиком кликов). Flex действительно позволяет избежать этого, как вы указываете, с помощью модели Subject-Observer, например, реализованной структурами данных [Bindable] или, как вы предлагаете, с использованием пользовательских событий. –

0

никогда не пытаться установить Refernce цепь

Почему нет? Вам просто нужно сделать это умно :-)

Если вы знаете идентификатор родителя или его тип класса, вы всегда можете просмотреть цепочку отображения, чтобы получить точный родительский объект, который вы ищете. Например, проверьте this.

К проблеме плаката: Я столкнулся с этим довольно много раз с искрами. Я думаю, обычно вам следует попробовать избежать ситуаций, когда ребенок зависит от его родителя. Если вы оказались в ловушке ситуации, когда вам отчаянно нужно получить ссылку на родителя, вы должны передать его с помощью конструктора ребенка при создании объекта (теперь это чистый путь - теоретически). Другой способ (как описано выше) - пройти через список отображения. Это опасно, если вы делаете это статически (parent.parent.parent). В приведенной выше ссылке приведен пример, показывающий, как решить проблему, используя простую рекурсивную функцию.