Воссоздание / сброс видов с помощью Flex ViewStack - PullRequest
1 голос
/ 22 февраля 2009

Я пишу приложение Adobe AIR, используя ViewStack для различных состояний приложения. Есть ли способ убедиться, что каждый компонент представления создается / уничтожается каждый раз, когда он отображается / скрывается?

Например, если у меня есть TextInput в представлении, я хочу, чтобы он возвращался в исходное состояние каждый раз, когда я переключаюсь на это представление, вместо того, чтобы вводить ранее текст. Или, если у меня есть таймер, я хочу, чтобы он был уничтожен, когда я покидаю представление, чтобы он не продолжал работать, когда я нахожусь в не связанной части приложения. Я знаю, что могу вручную инициализировать / уничтожить все в событиях show () и hide (), но есть ли более простой способ?

Ответы [ 6 ]

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

В MXML 2009 вы можете использовать itemDestructionPolicy = "auto", чтобы уничтожить компонент после его использования. Если вы используете это свойство в первом компоненте представления с двумя состояниями (init, logged), вы можете уничтожить и повторно инициализировать все дочерние компоненты представления. Пример:

   <s:states>
    <s:State name="init" />
    <s:State name="logged" />
  </s:states>

  <s:SkinnableContainer id="skincon" width="100%" height="100%" backgroundAlpha="0"
                        backgroundColor="#FFFFFF">
    <s:VGroup id="MainContainer" width="100%" height="100%" paddingTop="0"
              paddingLeft="20" paddingRight="20" gap="0">
      <views:_HeaderView id="header" />
      <mx:ViewStack id="viewStack" width="100%" height="100%">
        <s:NavigatorContent includeIn="init" itemDestructionPolicy="auto">
          <s:layout>
            <s:VerticalLayout horizontalAlign="center" verticalAlign="middle" />
          </s:layout>
          <views:LoginView title="Login" id="loginView" />
        </s:NavigatorContent>
        <s:NavigatorContent includeIn="logged" itemDestructionPolicy="auto">
          <s:layout>
            <s:VerticalLayout horizontalAlign="center" verticalAlign="top" />
          </s:layout>
          <views:_CentralView id="userView" />
        </s:NavigatorContent>
      </mx:ViewStack>
      <views:_FooterView id="footer" />

    </s:VGroup>
  </s:SkinnableContainer>
1 голос
/ 22 февраля 2009

ViewStacks может быть делом дьявола, когда дело доходит до создания / удаления политик и управления состоянием. У нас были всевозможные проблемы, когда мы разрабатывали fiat ecoDrive и примерно на 3/4, хотя мы все очень против ViewStacks для управления состоянием просмотра в нашем приложении.

Однако ... неплохо было бы сначала установить для creationPolicy значение ContainerCreationPolicy.NONE. Таким образом, вы сможете контролировать, когда создавать какие-либо панели в вашем ViewStack. Тогда я подумал бы, что вам понадобится какая-то логика, чтобы при изменении ViewStack панели она удаляла или сбрасывала ту, на которой вы были.

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

1 голос
/ 22 февраля 2009

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

ViewStack, однако, имеет два метода " saveState " и " loadState ", которые могут помочь вам в этом. Менеджер истории использует эти методы для включения навигации назад / вперед. В документации, похоже, нет примеров.

0 голосов
/ 17 февраля 2010

Я использую разные состояния для разных видов. При каждом изменении состояния я добавляю и удаляю компоненты.

Это вызывает add и remove события UIComponent пожара, которые позволяют мне инициализировать и очищать мои компоненты каждый раз, когда они добавляются.

Это идея ...

   <mx:states>
      <mx:State name="state1">
         <mx:AddChild>
            <mx:SomeUIComponent id="myComp" add="myComp.initialize()" remove="myComp.cleanup()"/>
         </mx:AddChild>
      </mx:State>
   </mx:states>
0 голосов
/ 26 февраля 2009

Создайте свои «представления» как отдельные модули, а затем используйте ViewStack для переключения между ними. Затем можно написать функцию для уничтожения неиспользуемых модулей (проверять каждый модуль на соответствие свойству selectedChild) при возникновении события ViewStack «change».

2 ¢

0 голосов
/ 24 февраля 2009

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" show="init()" hide="cleanup()">
    <mx:Script>
        <![CDATA[
            private var myComponent:MyComponent;

            private function init():void
            {
                myComponent = new MyComponent();
                componentContainer.addChild(myComponent);   
            }

            private function cleanup():void
            {
                componentContainer.removeAllChildren(); 
            }
        ]]>
    </mx:Script>

    <mx:Canvas width="100%" height="100%" id="componentContainer" />
</mx:Canvas>
...