Состояния Flex 4: includeIn и создание компонентаComplete - PullRequest
3 голосов
/ 02 февраля 2011

У меня есть компонент, который, как только он будет готов, должен установить состояние на основе переменной, которую я читаю из XML. Я попытался сделать это с creationComplete, но он, видимо, не готов, так как состояние не устанавливается для элементов рендеринга должным образом, но состояния и рендеринг работают нормально, если я выполняю последующее изменение состояния с действием щелчка на каком-либо элементе.

Что мне делать в этой ситуации, чтобы убедиться, что состояние установлено в нужное время и элементы, которые должны появиться из-за includeIn, существуют, чтобы их можно было визуализировать? initialize вместо creationComplete, кажется, не помогает при первом создании компонента. Любые последовательные вызовы компонента в порядке.

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

К вашему сведению, неудивительно, что initialize не сработало, оно срабатывает до создания дочерних элементов, а затем запускается creationComplete. Поскольку creationComplete является последним событием в жизненном цикле init, которое нужно запустить.

Иногда вам нужно изменить состояние дочернего компонента из родительского контейнера, если событие creationComplete для компонента запущено преждевременно.

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

Посмотрите документацию Adobe для жизненного цикла создания компонента

creationPolicy

Вам также может понадобиться установить атрибут creationPolicy для вашего приложения на all. (Я думаю, что по умолчанию это auto)

enterState

Вы можете подключить обработчик событий к enterState в объявлении состояния, как только будут запущены объекты в этом состоянии.

свойства visible.state.

В конечном итоге вы можете установить контейнеры для объектов на основе состояния, чтобы они были невидимыми / не включались в макет (свойства visible и includeInLayout.) В некоторых случаях у вас не будет никакого другого метода достижения объекта с помощью кода, потому что он выиграл не существует Однако enterState должен выполняться только после того, как было введено состояние просмотра, поэтому объекты в этом состоянии должны быть полностью доступны.

1 голос
/ 19 августа 2011

У меня была такая же ситуация, хотя мне приходилось проверять сброс экрана каждый раз, когда отображалось состояние. Первоначальный ответ был то, что мне было нужно, но мне потребовалось немного, чтобы разобраться. Это был ключевой бит:

Вы можете подключить обработчик события к enterState в объявлении состояния ... [выделение добавлено]

... который выглядит как:

protected function state1_enterStateHandler(event:FlexEvent):void
{
    myComponent.reset();
}

<s:states>
    <s:State id="state1" name="state1" enterState="state1_enterStateHandler(event)" />
    <s:State name="state2" />
</s:states>

<views:MyComponent id="myComponent" includeIn="state1" />

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

Это вызывает сброс каждый раз, когда state1 становится currentState и все компоненты готовы и свойства установлены.

1 голос
/ 27 апреля 2011

Я думаю, что вы можете просто заставить компоненты с состоянием, к которым вам нужен доступ, установить их itemCreationPolicy = немедленныйТогда они будут существовать при создании.

<s:states>
<s:State name="normal" />
<s:State name="special" />
</s:states>

<s:Label text="normal" includeIn="normal" /> //is available creationComplete
<s:Label text="special1" includeIn="special" itemCreationPolicy="immediate" /> //is available creationComplete
<s:Label text="special2" includeIn="special" /> //not available creationComplete
...