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