该实例使用URLLoader向服务器获取XML和txt(properties格式数据)数据,由于获取数据由URLLoader完成,我将些操作单独放到另一个as文件中,故与视图组件分开,那么如何通告视图组件已完成数据加载功能呢?我在自己的as文件中自定义了一个事件,当URLLoader完成数据加载时,发布自定义的事件并将数据随事件一起分布,再在视图组件中订阅自定义的事件。
一、先来认识一下URLLoader:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FB7305, #FAE605]" width="621" height="385"> <mx:Script> <![CDATA[ import com.mengya.URLLoaderTxt; internal function doTXT():void{ var urlLoaderTxt:URLLoaderTxt = new URLLoaderTxt(); } ]]> </mx:Script> <mx:Button x="49" y="40" label="测试URLLoader,读取文本" width="193" height="30" click="doTXT();"/> </mx:Application>
URLLoaderTxt 类如下:
package com.mengya{ import flash.display.Sprite; import flash.events.Event; import flash.events.IEventDispatcher; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLVariables; public class URLLoaderTxt extends Sprite { public function URLLoaderTxt(){ var loader:URLLoader = new URLLoader(); //订阅URLLoader的事件 configListeners(loader); var request:URLRequest = new URLRequest("myTxt.txt"); loader.load(request); } private function configListeners(dispatcher:IEventDispatcher):void { dispatcher.addEventListener(Event.COMPLETE,loaderComplete); dispatcher.addEventListener(Event.OPEN,openLoader); } private function loaderComplete(event:Event):void { var urlLoader:URLLoader = URLLoader(event.target); trace(urlLoader.data) var urlVariables:URLVariables = new URLVariables(urlLoader.data); trace(urlVariables.msg); } private function openLoader(event:Event):void{ trace("打开连接"); } } }
对URLLoader功能有初步的认识以后完成以上的功能,如下:
mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FB7305, #FAE605]" width="621" height="385" applicationComplete="initApp();"> <mx:Script> <![CDATA[ import com.mengya.LoadFinishEvent; import com.mengya.URLLoaderXML; [Bindable] private var dp:XMLList; internal function initApp():void{ //添加自己定义的数据加载完成事件 URLLoaderXML._eventDispatcher.addEventListener(LoadFinishEvent.LOADFINISHED,onLoadFinished); } internal function doXML():void{ var urlLoaderXML:URLLoaderXML = new URLLoaderXML(); } internal function onLoadFinished(event:LoadFinishEvent):void{ dp = new XMLList(event.data); } ]]> </mx:Script> <mx:Button x="49" y="88" label="测试URLLoader,读取XML" width="193" height="30" click="doXML();"/> <mx:DataGrid x="49" y="147" width="529" height="193" dataProvider="{dp}"> <mx:columns> <mx:DataGridColumn headerText="姓名" dataField="name" fontFamily="宋体" resizable="true"/> <mx:DataGridColumn headerText="电话" dataField="phone" fontFamily="宋体" resizable="true"/> <mx:DataGridColumn headerText="邮箱" dataField="email" fontFamily="宋体" resizable="true"/> </mx:columns> </mx:DataGrid> </mx:Application>
自定义事件类LoadFinishEvent如下:
package com.mengya{ import flash.events.Event; //自己定义一个事件,用于发布数据加载完成,将加载完数据随事件一起发布 public class LoadFinishEvent extends Event{ public static const LOADFINISHED:String = "Loadfinished"; public var data:String; public function LoadFinishEvent(type:String, data:String, bubbles:Boolean=false, cancelable:Boolean=false){ this.data = data; super(type,bubbles,cancelable); } } }
完成发布自定义的事件的类如下:
package com.mengya { import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.net.URLLoader; import flash.net.URLRequest; //这是一个非视图组件,在向服务器获取数据后发布一个自定义的事件,并将数据随着事件一起发布 public class URLLoaderXML extends Sprite{ public static var _eventDispatcher:EventDispatcher = new EventDispatcher(); public function URLLoaderXML(){ var loader:URLLoader = new URLLoader(); //配置对URLoader的事件订阅 configureListeners(loader); var request:URLRequest = new URLRequest("XMLFile.xml"); try{ //获取指定的XML数据 loader.load(request); }catch(error:Error){ trace(error.message); } } private function configureListeners(dispatcher:IEventDispatcher):void{ //订阅了URLLoader的Event.COMPLETE事件,表示加载完成 dispatcher.addEventListener(Event.COMPLETE,completeHandler); } public function completeHandler(event:Event):void{ var urlloader:URLLoader = URLLoader(event.target); //urlloader.data已包含加载来的数据 trace(urlloader.data); //发布自定义的事件,并将所加载完成的数据随事件一起发布,用于在视图组件订阅捕获 var evt:LoadFinishEvent = new LoadFinishEvent(LoadFinishEvent.LOADFINISHED, urlloader.data); _eventDispatcher.dispatchEvent(evt); } } }