从AS文件中更改selectedIndex

时间:2011-03-11 21:36:42

标签: flash flex actionscript-3 mxml

我有一个简单的按钮功能,可以在不使用菜单栏组件的情况下更改视图堆栈上的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;

}

2 个答案:

答案 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;