При изменении состояний изменения в Flex вносятся немедленно.

У меня есть приложение, которое переключалось между разными графиками в Flex. Каждый график - это собственное состояние. В MXML я установил так, чтобы источник изображения менялся при изменении состояния:

<s:Image id="chartImage"
         source.all="{ callImages.all }"
         source.classA="{ callImages.classB }"
         source.classB="{ callImages.classA }"
         />

У меня есть кнопки, которые успешно меняют изображения. Однако у меня есть небольшая ошибка, которая возникает из-за того, что после строки

this.currentState = chartName;

В моем коде ожидалось, что источник изображения графика будет изменен, однако фактическое изменение элемента s: Image, по-видимому, не произойдет до тех пор, пока функция не завершится и экран не обновится, я полагаю. Поэтому, когда он захватывает chartImage.height, он использует старый из состояния, которое я только что покинул.

Есть ли способ получить новое изображение (и, следовательно, его размеры), чтобы я мог производить расчеты с этими размерами в следующей строке? На данный момент chartImage.height возвращает высоту до изменения состояния, но она отличается после выполнения функции.

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


person ShawnPConroy    schedule 11.12.2012    source источник


Ответы (2)


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

Каждый компонент Flex должен пройти собственный цикл проверки, который построен на основе механизма визуализации Flash Player. Если вы выполните поиск в Google по Flash / Flex Elastic Racetrack.

Однако вы можете принудительно запустить компонент через его методы проверки линейным образом, вызвав validateNow ().

Возможно - особенно если у вас есть переход между состояниями - что свойства вашего изображения еще не изменились после того, как вы установили переменную currentState.

person JeffryHouser    schedule 12.12.2012

Обычно вы не можете изменить источник изображения в Flex, а затем сразу проверить («на следующей строке») его высоту - исключение может быть, когда источником является необработанное растровое изображение, но даже тогда структура макета Flex будет варьироваться в зависимости от разные факторы, поэтому я бы не стал на это полагаться.

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

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

Вы можете привязать к высоте SparkImage через mxml:

<s:Image id="chartImage" />
<s:Label id="debugLabel" text="{ 'Height of chartImage: ' + chartImage.height }" />

но если вам нужно запустить логику, я бы рекомендовал использовать BindingUtils (в блоке скрипта):

import mx.binding.utils.BindingUtils;

protected function someOtherFunctionBlock():void
{
    BindingUtils.bindSetter( handleHeigtChange, image, "height" );
}

protected function handleHeigtChange( value:Number ):void
{
   // Deal with value change
}
person Mark Fox    schedule 12.12.2012
comment
Спасибо. Хорошая информация. Это не соответствует требованиям моего кода, но может исправить множество проблем с макетом. - person ShawnPConroy; 24.12.2012