Воспроизведение/восстановление просмотров с помощью Flex ViewStack


1

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

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

0

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

<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> 

1

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

ViewStack однако имеет два метода: «saveState» и «loadState», которые могут помочь вам в этом. Менеджер истории использует эти методы для включения обратной/передовой навигации. Однако у документов нет примеров.


1

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

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

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


0

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

2 ¢


0

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

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

Это идея ...

<mx:states> 
     <mx:State name="state1"> 
     <mx:AddChild> 
      <mx:SomeUIComponent id="myComp" add="myComp.initialize()" remove="myComp.cleanup()"/> 
     </mx:AddChild> 
     </mx:State> 
    </mx:states> 

1

В MXML 2009, вы можете использовать itemDestructionPolicy = "авто", чтобы уничтожить компонент после использования его.Если вы используете это свойство в первом компоненте представления с двумя состояниями (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>