我有一个简单的按钮功能,可以在不使用菜单栏组件的情况下更改视图堆栈上的selectedIndex。我从按钮上的click属性调用该函数,并传递一个int作为我想要跳转到的索引。当我在应用程序MXML文件上有代码时一切正常。将我的动作脚本移动到单独的文件后,我可以访问未定义的属性错误:
protected function changeView(index:int):void
{
myViewStack.selectedIndex = index;
}
如何让.as文件识别myViewStack组件?我是否需要在.as文件中的某处引用Main.MXML?感谢。
以下是我的其余代码:
<?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:comps ="components.*"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1100" minHeight="1000" width="100%" height="100%" pageTitle="List Giant v2.3">
<mx:ViewStack id="lgViewStack" width="100%" height="100%" verticalCenter="0" horizontalCenter="0" selectedIndex="0">
<s:NavigatorContent label="HOME" width="100%" height="100%" id="homeView">
<s:VGroup width="100%" height="100%" verticalCenter="0" horizontalCenter="0" gap="0" id="homeMainVG">
<comps:TopNav>
</comps:TopNav>
<s:HGroup width="100%" height="90%" gap="0">
<comps:LeftNav>
</comps:LeftNav>
<comps:HomeContent>
</comps:HomeContent>
<comps:RightNav>
</comps:RightNav>
</s:HGroup>
</s:VGroup>
</s:NavigatorContent>
</mx:ViewStack>
</s:Application>
我将向您展示HomeContent.mxml组件,因为它具有其他页面所具有的所有问题,但它是最小的文件:
<?xml version="1.0" encoding="utf-8"?>
<fx:Script source="../actions/ButtonHandlers.as"/>
<s:layout>
<s:BasicLayout/>
</s:layout>
<s:Panel width="30%" height="200" left="10" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
<s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(6,lgViewStack);"/>
<s:Label y="10" text="My Admin" horizontalCenter="0" fontWeight="bold" fontSize="24"/>
<s:Label y="102.95" text="Click here to update your account information and settings." height="44" width="174" textAlign="center" horizontalCenter="-1" fontSize="10"/>
</s:Panel>
<s:Panel width="30%" height="200" horizontalCenter="0" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
<s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(2,lgViewStack);"/>
<s:Label y="10" text="My Counts" horizontalCenter="0" fontWeight="bold" fontSize="24"/>
<s:Label y="113.95" text="Click here to see you list counts." textAlign="center" verticalAlign="middle" horizontalCenter="0"/>
</s:Panel>
<s:Panel width="30%" height="200" right="10" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
<s:layout>
<s:BasicLayout/>
</s:layout>
<s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(4,lgViewStack);"/>
<s:Label y="18" text="My Orders" horizontalCenter="0" fontSize="24" fontWeight="bold"/>
<s:Label y="117" text="Click here to see your lsit orders." textAlign="center" verticalAlign="middle" horizontalCenter="0"/>
</s:Panel>
<s:Panel width="96%" height="75%" horizontalCenter="0" bottom="50" dropShadowVisible="false">
<s:Label text="List Giant Community News" left="10" top="10" fontWeight="bold" fontSize="20"/>
<s:SkinnableDataContainer width="100%" height="100%" left="0" top="35"/>
<mx:HRule horizontalCenter="0" top="225" width="90%"/>
<mx:HRule horizontalCenter="0" top="450" width="90%"/>
<s:Label x="32" y="46" text="LG World"/>
<s:Label x="32" y="233" text="Promotions"/>
<s:Label x="32" y="458" text="Resources"/>
</s:Panel>
最后是带有问题功能的.as文件:
import mx.containers.ViewStack;
protected function changeView(index:int, myViewStack:ViewStack):void
{
myViewStack.selectedIndex = index;
}
答案 0 :(得分:0)
您是否将AtionScript移动到包含文件?还是新课?这个新文件如何包含在您的应用程序MXML文件中?我怀疑你的问题是一个范围问题。我会在你创建一个新类的假设下继续写作。所以,你有这样的事情:
主要申请
| - 类w / changeView功能
| - ViewStack
在这样的架构中; Main Application可以调用方法,或在changeView类或ViewStack上设置属性。 changeView类或ViewStack可以通过调度事件与主应用程序“对话”。但是,changeView类无法以任何方式与ViewStack通信;并且ViewStack无法与changeView类通信。
在此体系结构中,changeView类获取“未定义属性”错误的原因是因为changeView类没有名为myViewStack的变量。它对它的父实例变量/子节点及其子节点都一无所知。
您有几个选择:
让changeView类调度一个事件,主应用程序将侦听该事件,然后更改ViewStack上的selectedIndex。这听起来有点过分;并且几乎首先打败了这种功能的“封装”的目的。
您可以将viewStack变量作为参数传递给changeView类,或将其设置为实例变量并以此方式更改。像这样:
protected function changeView(index:int, myViewStack:ViewStack):void
{
myViewStack.selectedIndex = index;
}
虽然我不确定这是不是你的想法,但这会有效。
答案 1 :(得分:0)
当您从mxml类中取出ActionScript时,您将其从范围中删除。 在你有这个代码的功能
myViewStack.selectedIndex = index;
您正尝试在不存在的类文件中引用myViewStack。
myViewStack.selectedIndex = index;
和说
是一回事this.myViewStack.selectedIndex = index;
这指的是方法所在的类。
在具有changeView方法的类中,您需要创建一个名为myViewStack的公共var。 然后,在mxml中实例化类后,您需要分配myViewStack
var myClass:MyClassWithchangeView = new MyClassWithchangeView ( );
myClass.myViewStack = viewStackSource;