2010-09-17 4 views
0

J'ai un ViewStack avec les enfants que je veux afficher/cacher en fonction de l'état de l'application estFlex enfants ViewStack includeIn fonctionne drôle

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       xmlns:eworx="com.eworx.*" 
       xmlns:view="com.eworx.view.*" 
       xmlns:components="com.eworx.view.components.*" 
       skinClass="com.eworx.view.skins.MainAppSkin" 
       xmlns:layouts="com.eworx.view.layouts.*" 
       currentState="login" 
       initialize="init(event)" 
       creationComplete="complete(event)" 
       width="100%" 
       height="100%"> 


    <fx:Style source="assets/css/screen.css" /> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.core.FlexGlobals; 
      import mx.events.FlexEvent; 

      import nl.demonsters.debugger.MonsterDebugger; 

      private var debugger:MonsterDebugger; 

      [Bindable] 
      public var apiUrl:String; 

      [Bindable] 
      public var customerType:String; 



      protected function init(event:FlexEvent):void 
      { 
       debugger = new MonsterDebugger(this); 
      } 

      protected function complete(event:FlexEvent):void 
      { 
       var activated:Boolean = FlexGlobals.topLevelApplication.parameters.activated; 
       var passwordReset:Boolean = FlexGlobals.topLevelApplication.parameters.passwordReset; 
       var message:String = FlexGlobals.topLevelApplication.parameters.message; 

       apiUrl = FlexGlobals.topLevelApplication.parameters.apiUrl; 

       if(activated) 
       { 
        Alert.show(message,"Notice"); 
       } 

       if(passwordReset) 
       { 
        Alert.show(message,"Notice"); 
       } 

       systemManager.addEventListener(MouseEvent.MOUSE_WHEEL,onMouseWheel,true); 

      } 

      private function onMouseWheel(e:MouseEvent):void 
      { 
       e.delta *= 5; 
      } 

     ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
     <eworx:Seven7Context contextView="{this}" /> 
     <s:Fade id="fadeIn" alphaFrom="0" alphaTo="1" duration="300" /> 
     <s:Fade id="fadeOut" alphaFrom="1" alphaTo="0" duration="300" /> 
     <s:Rotate3D id="r3d" angleYFrom="0" angleYTo="360" duration="300" /> 
    </fx:Declarations> 

    <s:states> 
     <s:State name="login" /> 
     <s:State name="wholesale" /> 
     <s:State name="retail" /> 
    </s:states> 

    <view:LoginForm id="loginForm" includeIn="login" horizontalCenter="0" verticalCenter="0" /> 

    <s:Group excludeFrom="login" width="960" horizontalCenter="0"> 

     <s:BitmapImage width="100%" height="42" x="13" y="80" source="@Embed('assets/garnish/bar.png')" /> 
     <mx:Image source="assets/garnish/logo.png" top="23" /> 

     <s:HGroup verticalAlign="middle" x="198" y="47"> 
      <s:TabBar skinClass="MainMenuTabBarSkin" dataProvider="{vs}" buttonMode="true"/> 
      <mx:LinkButton id="logout" label="Logout" click="{currentState='login'}" /> 
     </s:HGroup> 

     <s:HGroup top="0" right="0" gap="1" verticalAlign="top"> 
      <components:OfferList /> 
      <components:MarginBuildersTrack /> 
      <components:CartTrack top="0" /> 
     </s:HGroup> 

     <mx:ViewStack 
      id="vs" 
      top="120" 
      horizontalCenter="0" 
      width="960" 
      height="100%" 
      resizeToContent="true" > 
      <view:HomePage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="Home" /> 
      <view:ShowroomPage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="Showroom" /> 
      <view:CataloguePage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="Catalogue" /> 
      <!--<view:IncentivesPage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="Incentives" />--> 
      <view:RetailCustomerProfilePage includeIn="retail" showEffect="{fadeIn}" hideEffect="{fadeOut}" label="My Profile" /> 
      <view:WholesaleCustomerProfilePage includeIn="wholesale" showEffect="{fadeIn}" hideEffect="{fadeOut}" label="My Profile" /> 
      <view:ClientsPage excludeFrom="retail,login" showEffect="{fadeIn}" hideEffect="{fadeOut}" label="My Clients" /> 
      <view:CartPage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="My Cart" /> 
      <view:OrdersPage showEffect="{fadeIn}" hideEffect="{fadeOut}" label="My Orders" /> 
     </mx:ViewStack> 
    </s:Group> 

</s:Application> 

Comme vous pouvez le voir, j'inlude la vue du client de détail dans l'état de détail et la vue du client de gros dans l'état de gros. Le problème est que lorsque je lance mon application, elle n'apparaît sur aucun état.

Des idées?

Répondre

0

Ceci est une approche étrange pour moi. Le but de ViewStack est de montrer seulement un article à la fois. C'est une approche très étrange.

Je vois que vous avez une barre d'onglets dont dataProvider est ViewStack. Toutefois, votre ViewStack n'est pas créé en tant que propriété pouvant être liée sur le composant et vous ne semblez jamais configurer un état initial. Donc, je théorise que cela se passe:

  1. charges App dans l'état par défaut, ce qui est la chaîne vide
  2. ViewStack et/ou TabBar sont initialisés sans les enfants
  3. état App changements pour une raison quelconque
  4. TabBar ne met pas à jour

CreationPolicy peut également entrer en jeu, mais je ne suis pas sûr. Vous devrez parcourir le code pour comprendre ce qui se passe. Je vous recommande fortement d'envisager une autre approche à ce sujet. Créer éventuellement le navigateur de tabulation dataProvider manuellement en fonction des paramètres de sécurité de l'utilisateur ou de l'état actuel.

+0

Mon application a un état par défaut de "connexion" qui a une vue formulaire de connexion. Lorsqu'un utilisateur se connecte, je vérifie s'il est un client de vente au détail ou en gros et change en conséquence l'état actuel. Je veux donc avoir des vues différentes pour chaque type d'utilisateur. J'utilise le viewstack pour les vues de l'application et la barre d'onglets pour la navigation. Pourquoi est-ce une approche étrange. En passant la créationPolicy à tout ce qui fonctionne, mais j'ai le surcoût initial. – chchrist

+0

Je n'ai jamais vu quelqu'un utiliser ViewStack en tant que dataProvider d'un TabBar. Je n'ai jamais vu quelqu'un utiliser "includeIn" pour les enfants d'un ViewStack. Ce sont ces raisons que je dis c'est étrange. La plupart des approches que j'ai utilisées utilisent des états ou ViewStacks; mais vous mélangez les deux. C'est pourquoi je dis que c'est étrange. Comme cela fonctionne comme vous le pensiez, lorsque creationPolicy est défini sur tout, je vous renvoie simplement à ma théorie d'origine sur la liaison ViewStack et le TabBar ne change pas. – JeffryHouser

+0

Dans l'état de "connexion", ni le détail ni le commerce de gros n'existent b/c de votre utilisation incluse. Lorsque vous changez d'état, le DataProvider de TabBar ne met pas à jour la mise à jour car ViewStack n'est pas conçu pour être lisible. Je parie que ça marchera si vous créez le ViewStack en ActionScript et le rendre lisible. Ce sera un peu fastidieux, mais b/c alors vous devrez créer tous les enfants de ViewStack dans AS3 aussi. – JeffryHouser

Questions connexes