принудительно перерисовать компонент - PullRequest
0 голосов
/ 10 января 2011

У меня есть приложение с экраном входа в систему.Когда пользователь нажимает «enter», состояние изменяется на «login», и дочерний компонент запускается для загрузки (хотя дочерний элемент остается невидимым в данный момент).Ребенок содержит много функций, которые нужны пользователю при входе в систему (т. Е. Его имя экрана и настройки извлекаются из базы данных).Следующее включено в 'Parent':

<local:comp id="localComp" includeIn="login" includeInLayout="false" visible="false"/>
<mx:Button label="login" click="currentState='login'"/>
<mx:Button label="logout" click="currentState='Default'"/>

Моя проблема заключается в том, что пользователь выходит из системы (состояние изменяется на «Default») и затем снова входит в систему (состояние изменяется на «login») дочернего элементане запускается снова, а функции с дочерним элементом не перезагружаются.Есть ли способ заставить моего ребенка освежиться?

Примечание. Хотя было бы проще просто перенести дочерние функции в родительскую, это сложно ... Я переместил эти функции в дочернюю, чтобы было легче следовать

ОБНОВЛЕНИЕ: Ядаже попытался добавить «exitState» в мое состояние:

<s:State name="login" exitState="removeElement(localComp)" /> 

Это тоже не работает, так как я получаю сообщение об ошибке: «RangeError: Index 0 находится вне диапазона».

ОБНОВЛЕНИЕ: даже если вам разрешено вызывать дочернюю функцию от родителя, моя проблема заключается в том, что ребенок должен быть «создан», чтобы не отображать ошибки.Мне не имеет смысла, почему гибкая команда сделала бы что-то вроде удаления и добавления детей настолько сложным.

Ответы [ 3 ]

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

Ваш ребенок больше не «срабатывает», потому что каждый раз, когда вы меняете состояние, это один и тот же ребенок. Flex просто переключает видимость - это все тот же объект. Если вы хотите делать определенные вещи при добавлении ToStage, вам нужно удалить / добавить этот дочерний элемент на этапе, когда состояние изменяется, а не просто переключать его видимость.

Полезный способ сделать это с Flex 3's <mx:AddChild/>

Пример:

<mx:states>

        <mx:State name="login">

            <mx:AddChild position="firstChild">

                <local:comp id="localComp"/>

            </mx:AddChild>

        </mx:State>
</mx:states>
0 голосов
/ 26 апреля 2011

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

enterState срабатывает на localComp? Вы можете позвонить init оттуда. Или, если init() является обработчиком инициализации для вашего компонента, попросите его выполнить все необходимые сантехнические работы, которые необходимо выполнить, и перенесите фактический код на момент входа в систему в отдельную функцию.

Конечно, это не совсем то, как я бы поступил так или иначе. Вставка логики в компонент, который имеет всю инфраструктуру, позволяющую ему быть частью графа экранного объекта, а затем не отображает его, является расточительным. Вместо этого сделайте так, чтобы ваш «компонент» наследовал от Object или чего-то еще, а затем просто объявите его экземпляр внутри блока скрипта. Тогда вы можете просто вызвать его логику прямо из обработчика login click. Просто используйте состояния, чтобы обновить состояние пользовательского интерфейса ... для этого они и предназначены.

<mx:Button label="login" click="login_clickHandler(event)"/>
<mx:Button label="logout" click="currentState='Default'"/>

<fx:Script>
    <![CDATA[
        protected var localComp:MyComponent = new MyComponent();

        protected function login_clickHandler(event:MouseEvent):void
        {
            localComp.DoLoginStuff();
            currentState = 'login';
        }    
    ]]>
</fx:Script>
0 голосов
/ 10 января 2011

Во-первых, я думаю, вам не нужно устанавливать свойства includeIn и visible + includeInLayout в вашем пользовательском компоненте. При использовании includeIn платформа автоматически удалит ваш компонент из списка отображения, когда он находится в другом состоянии, чем «вход в систему».

Чтобы ответить на ваш вопрос, я бы предпочел использовать событие AddedToStage (внутри вашего пользовательского компонента) или currentStateChanged (в родительском компоненте). Эти события должны запускаться при изменении состояния на логин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...