Apache flex Flex viewstack儿童版includeIn的工作非常有趣
我有一个包含子对象的viewstack,我想根据应用程序的状态显示/隐藏它Apache flex Flex viewstack儿童版includeIn的工作非常有趣,apache-flex,states,viewstack,Apache Flex,States,Viewstack,我有一个包含子对象的viewstack,我想根据应用程序的状态显示/隐藏它 <?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
<?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>
如您所见,我包括零售状态下的零售客户视图和批发状态下的批发客户视图。问题是,当我运行我的应用程序时,它们不会出现在两个州
有什么想法吗?这对我来说是个奇怪的方法。ViewStack的全部用途是一次只显示一个项目。这是一种非常奇怪的方法 我看到您有一个tabbar,它的数据提供者是ViewStack。但是,ViewStack不是作为组件上的可绑定属性创建的,而且您似乎从未设置初始状态。因此,我推测这正在发生:
创意政策也可能发挥作用,但我不确定。你必须一步一步地通过代码来弄清楚发生了什么。我强烈建议你考虑另一种方法。可能会根据用户安全设置或当前状态手动创建tabbar navigator数据提供程序 我的应用程序有一个默认状态“登录”,它有一个登录表单视图。当用户登录时,我会检查他是否是零售或批发客户,并相应地更改当前状态。所以我想为每种类型的用户提供不同的视图。我使用viewstack作为应用程序视图,使用tabbar作为导航。为什么这是一个奇怪的方法。顺便说一句,将creationPolicy更改为所有可用的策略,但我有最初的开销。我从未见过有人使用ViewStack作为选项卡的数据提供程序。我从未见过有人对ViewStack的子对象使用“includeIn”。正是这些原因,我说这很奇怪。我见过的大多数方法要么使用状态,要么使用视图堆栈;但你把这两者混在一起了。这就是为什么我说这很奇怪。由于它的工作原理与您预期的一样,当creationPolicy设置为all时,我将向您介绍我关于ViewStack绑定和选项卡栏不变的原始理论。在“登录”状态下,您的includein使用中既不存在零售也不存在批发。更改状态时,选项卡栏的数据提供程序不会更新,因为ViewStack不可绑定。我敢打赌,如果您在ActionScript中创建ViewStack并使其可绑定,它将起作用。这将有点乏味,不过b/c也必须在AS3中创建ViewStack的所有子级。我已经考虑了您所说的,并且根据状态制作了两个ArrayCollection用作选项卡栏的数据提供程序,并且我已经从ViewStack中删除了includein。创建pollicy:所有这些都增加了很多开销。