昨天使用了方法回调的方式实现的,今天写了个以手动触发自定义事件,在分派回的事件流中携带交互数据对象的方式实现父子页面交互
首先自定义一个事件,myEvent.as文件
- package
- {
- import flash.events.Event;
- public class MyEvent extends Event
- {
- public static const CONFIGEDITE:String="configedit";
- public var obj:Object;
- public function MyEvent(type:String,obj:Object)
- {
- this.obj = obj;
- super(type);
- }
- override public function clone():Event {
- var e:MyEvent = new MyEvent(CONFIGEDITE,obj);
- return e;
- }
- }
- }
父页面,test.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:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
- >
- <!-- 通过方法赋值的方式回调 -->
- <fx:Script>
- <![CDATA[
- import mx.managers.PopUpManager;
- [Bindable]
- public var testForm:TestForm = new TestForm; //定义为全局的,这样就只弹一个窗口了
- public function jump():void{
- //弹出窗口
- PopUpManager.addPopUp(testForm,this,false);
- //添加自定义事件监听,当触发该事件将执行里面的方法
- testForm.addEventListener(MyEvent.CONFIGEDITE,function(e:MyEvent):void{
- showLable.text = e.obj.name;
- });
- //组装父页面要传到子页面的对象
- var obj:Object = new Object;
- obj.name = valueText.text;
- testForm.initPage(obj);
- }
- ]]>
- </fx:Script>
- <s:VGroup horizontalAlign="center" verticalAlign="middle" width="80%" height="200">
- <s:Label text="我是父页面,子页面传过来的值为:"/>
- <s:Label id = "showLable"/>
- <s:TextInput id="valueText"/>
- <s:Button label="点击将值传递到子页面" click="jump()"/>
- </s:VGroup>
- </s:Application>
子页面,TestForm.mxml文件
- <?xml version="1.0" encoding="utf-8"?>
- <s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="400" minHeight="200"
- title="子页面"
- close="close()"
- >
- <fx:Script>
- <![CDATA[
- import mx.managers.PopUpManager;
- //关闭
- public function close():void{
- PopUpManager.removePopUp(this);
- }
- //初始化
- public function initPage(obj:Object):void{
- showLabel.text = obj.name;
- }
- public function goBack():void{
- //组装要传到父页面的对象
- var obj:Object = new Object;
- obj.name = valueText.text;
- //手动触发指定事件
- var myEvent:MyEvent = new MyEvent(MyEvent.CONFIGEDITE,obj);
- //抛出事件
- this.dispatchEvent(myEvent);
- }
- ]]>
- </fx:Script>
- <s:VGroup horizontalAlign="center" verticalAlign="middle" width="80%" height="200">
- <s:Label text="我是子页面,父页面传过来的值为:"/>
- <s:Label id="showLabel" />
- <s:TextInput id="valueText"/>
- <s:Button label="点击将值传递到父页面" click="goBack()"/>
- </s:VGroup>
- </s:TitleWindow>
最后上截图~
这样的方法,如果不用传递数据对象的话,只是需要标识的话,只需要在自定义事件里写不同的事件,然后手动触发不同的事件,根据触发不同的事件执行不同的方法即可。