Flex + MXML: получение родительской формы из поля ввода «событие» - PullRequest
0 голосов
/ 02 ноября 2010

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

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

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

Мой вопрос - что такоелучший способ получить дескриптор родительской формы цели события во Flex?Иерархия родитель-ребенок в 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 в Form, но, как вы можете видеть, прекрасная архитектура Spark с поддержкой скинов помещает все остальные экранные объекты и контейнеры между ними.1016 *

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

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

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

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

0 голосов
/ 12 января 2011

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

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

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

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

...