Динамически позиционируемые гибкие компоненты
-
03-07-2019 - |
Вопрос
В моем текущем проекте (приложение Flex, которое будет запускаться в проигрывателе Flash Player) у меня есть требование отображать произвольное подмножество компонентов в форме, скрывая при этом все остальные компоненты на основе определенных аспектов состояния приложения.Существует около дюжины различных текстовых полей и раскрывающихся списков, но некоторые из них становятся неактуальными в зависимости от ранее введенных пользовательских данных, и мы не хотим отображать их, когда добираемся до этой конкретной формы.Каждый раз, когда отображается эта форма, мне может потребоваться показать любую из многих перестановок этих компонентов.
Я пытаюсь решить, как лучше всего подойти к этой проблеме.Должен ли я создать Canvas (или другой контейнер) со всеми необходимыми элементами управления, а затем просто установить видимость = false для тех, которые мне не нужны?Тогда проблема заключается в том, чтобы макет выглядел прилично.Я не хочу, чтобы там, где были бы скрытые элементы управления, оставались пробелы.
Другой вариант, о котором я подумал, - это просто механизм, который мог бы динамически создавать экземпляры TextInput или CheckBox и т. д.компонент, а затем вызвать контейнер.addChild(control), чтобы создать компоненты и не беспокоиться о проблеме пробелов.
Кажется, это проблема, у которой есть идиоматическое решение в гибкой системе, но я не знаю, какое именно.Ни одна из этих идей не кажется хорошей, поэтому мне интересно, есть ли у кого-нибудь идея получше.
Решение
Не знаю, хорошее это решение или нет, но когда я оказался в точно такой же ситуации, я воспользовался по сути вашим первым методом.Набор visible = false
а также установил includeInLayout = false
чтобы предотвратить те «пробелы», о которых вы говорили.Это очень простое решение, очень легко и быстро реализуемое...возможно, кто-то еще знает что-то более идиоматичное.
Другие советы
Лучший практический способ сделать это — использовать состояния.Например:
<mx:states>
<mx:State name="State1">
<mx:AddChild position="lastChild">
<components.../>
</mx:AddChild>
</mx:State>
<mx:State name="State2">
<mx:AddChild position="lastChild">
<mx:Canvas.../>
</mx:AddChild>
<mx:AddChild position="lastChild">
<mx:VBox.../>
</mx:AddChild>
</mx:State>
</mx:states>
Затем в вашем коде вы вызываете this.currentState = «State1», чтобы включить первое состояние и т. д.Используя состояния, вы можете выборочно отображать и скрывать компоненты.
Я рекомендую поискать в Google учебные пособия по гибким состояниям и попробовать некоторые из них, чтобы получить правильное представление о том, как работают состояния.
Если штаты не подходят, ознакомьтесь со статьями, объясняющими жизненный цикл компонентов.
Если вы создадите класс, который расширяет гибкий компонент, такой как Canvas, вы определите все компоненты в функции, которая переопределяет createChildren.Вы вернетесь к макету в другой функции, которая переопределяет updateDisplayList.
- Жизненный цикл гибкого компонента @flexcomps
- Класс компонента — часть третья @PeterEnt
- Жизненный цикл гибкого компонента @guavus
- Понимание разработки пользовательских компонентов Flex @billWhite