Динамически размещенные гибкие компоненты - PullRequest
3 голосов
/ 16 октября 2008

У меня есть требование к моему текущему проекту (приложение Flex, которое будет запускаться во Flash Player), чтобы отображать произвольное подмножество компонентов в форме, в то же время скрывая все остальные компоненты в зависимости от определенных аспектов состояния приложения. Существует около десятка различных текстовых полей и раскрывающихся списков, но некоторые из них становятся неактуальными на основе ранее введенных пользовательских данных, и мы не хотим отображать их, когда перейдем к этой конкретной форме. Каждый раз, когда отображается эта форма, мне может понадобиться показать одну из многочисленных комбинаций этих компонентов.

Я пытаюсь решить, как лучше всего подойти к этой проблеме. Должен ли я создать Canvas (или другой контейнер) со всеми необходимыми элементами управления на нем, а затем просто установить visible = false на те, которые мне не нужны? Проблема тогда состоит в том, чтобы удостовериться, что расположение выглядит приличным. Я не хочу, чтобы были пробелы, где были бы скрытые элементы управления.

Другой вариант, о котором я думал, это просто иметь механизм, который мог бы динамически создавать экземпляр компонента TextInput или CheckBox и т. Д., А затем вызывать container.addChild (control) для создания компонентов и не беспокоиться о проблема разрыва.

Это похоже на проблему, которая имеет идиоматическое решение в flex, но я не знаю, что это такое. Ни одна из этих идей не кажется великолепной, поэтому мне интересно, есть ли у кого-нибудь идея получше?

Ответы [ 3 ]

5 голосов
/ 17 октября 2008

Лучший способ сделать это - использовать состояния. Например:

<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", чтобы включить первое состояние и т. Д. Используя состояния, вы можете выборочно показывать и скрывать компоненты.

Я рекомендую поискать учебники по гибким состояниям и пробовать их, чтобы получить представление о том, как работают состояния.

4 голосов
/ 17 октября 2008

Я не знаю, хорошее ли это решение или нет, но когда я оказался в точно такой же ситуации, я применил в основном ваш первый метод. Установите visible = false, а также includeInLayout = false, чтобы предотвратить те "пробелы", о которых вы говорили. Это очень простое решение, очень простое и быстрое в реализации ... возможно, кто-то еще знает что-то более идиоматическое.

0 голосов
/ 24 октября 2008

Если состояния не подходят, ознакомьтесь со статьями, в которых объясняется жизненный цикл компонентов.

Если вы создадите класс, расширяющий гибкий компонент, такой как Canvas, вы определите все компоненты в функции, которые переопределяют createChildren. Вы вернетесь к макету в другой функции, которая переопределяет updateDisplayList

...