当视图状态在Flex中更改时运行一个函数

我正在学习Flex并试图制作一个简单的RPG来练习。 我正在使用视图状态在屏幕之间切换。 现在我有一个显示我的角色信息的HomeView.mxml,显示我的库存项目的InventoryView.mxml,以及显示装备项目的EquipmentView.mxml。 他们每个人都有自己的观点状态。

在我的主要mxml文件中,我为游戏中的角色和物品的ArrayCollection创建了一个全局变量。 它在mxml中为库存和设备创建了2个标签,当我点击标签时,它会调用一个设置currentState =“EquipmentView”或“InventoryView”的点击处理程序,

这是有效的,并且状态改变并且相应的视图被正确显示。

我的问题是在我的EquipmentView状态。 当我第一次进入状态时,它有一个creationComplete功能,它为我的设备显示图像并设置点击处理程序。 当我点击该项目时,它会“解开”它并将其从设备列表中删除并移除图像。 这也可以正常工作,但是当我进入我的库存视图并“装备”一件物品并返回到EquipmentView时,图像不显示。 我有一个标签,它可以计算我的设备列表变量的长度,当我切换视图时它是准确的,但我不能让图像再次显示。

有什么方法可以在视图更改时调用我的displayEquippedItems()函数(最初在creationComplete上调用它)?

这里是我的功能:

protected function displayEquippedItems():void
        {
            Alert.show("Displaying Items");
            for (var i:int = 0; i<c.equippedItems.length; i++)
            {

                var item:Item = c.equippedItems.getItemAt(i) as Item;
                switch (item.type)
                {                       
                    case 'Weapon':
                        var il:ItemImage = new ItemImage(item);
                        il.source = "../assets/sword.gif";
                        il.scaleX=.25;
                        il.scaleY=.25;
                        il.horizontalCenter=-80;
                        il.verticalCenter=-30;
                        il.addEventListener(MouseEvent.CLICK, equippedItemClicked);
                        equipGroup.addElement(il);                          
                        break;
                    default:
                        Alert.show("Didnt find a weapon");
                        break;
                }
            }
        }

ItemImage是我定义的一个类,它扩展了Image组件,并且只将一个变量“item”设置为它显示的Item,这样我就可以获取名称,类型(并最终更改图像源)。另外equipGroup只是我定义的一个组装备物品的mxml

任何帮助将是伟大的,谢谢


有几种方法可以完成我相信你想要的。

首先看看updateComplete事件。 而creationComplete只会在组件的创建周期完成后执行一次; 每次组件重绘时,updateComplete事件都会触发。 我毫不怀疑,这个事件会做你想做的事情; 然而,你会想要多次小心地运行你的代码。 许多事情可能会导致组件重绘,而且这听起来像您有一个非常具体的用例。

第二件要看的就是展会。 只要组件可见,就会触发; 当状态改变到显示这个组件的状态时它应该触发。

回答你的具体问题; 只要使用stageChangeComplete事件完成状态更改,就可以运行代码。 在你的情况下,我相信这可能与展会活动类似。 但你会在不同的地方聆听它。 stateChangeComplete事件是您在包含状态的组件中侦听的内容。 展示事件是您在包含广告资源的组件中倾听的内容; 我认为这是控制状态的组件的孩子。


您还可以使用State对象调度的enterState事件...您可以像这样在MXML中添加事件侦听器:

<s:states>
    <s:State name="myState" enterState="myEventHandler()"/>
</s:states>

有什么更好的,然后'updateComplete'事件是每次组件完成一个完整的“Flex组件生命周期”完成后FlexEvent.UPDATE_COMPLETE将被分派。 所以,根据你在做什么,你可能会注意到这个事件被调度(并且你的事件处理程序被触发)的次数超过了你需要的次数。

通过使用enterState事件处理程序,只有在进入特定状态时才会执行代码:)

链接地址: http://www.djcxy.com/p/34633.html

上一篇: Run a function when view state is change in Flex

下一篇: Flex3 AdvancedDataGrid : how to add a new column based on existing one?