Я не уверен, что лучшая практика заключается в попытке «сделать что-то» с формой в результате взаимодействия с пользователем - я, безусловно, открыт для альтернатива, если это лучшая практика.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, и есть другая парадигма, которую я должен просто поднять, чтобы мои джинсы приняли?
Кстати, хотя ответ Робусто - настоящий Маккой, что я искал - более структурную иерархию, чем цепочку DisplayObject, - можно найти через UIComponent.owner. Поэтому, чтобы делать то, что я хотел (что не является лучшей практикой), вы бы сказали event.target.owner.owner. –