发布网友 发布时间:2022-07-20 07:23
共1个回答
热心网友 时间:2023-10-20 11:51
首先说起EventBus,有过框架使用经验的朋友应该不会陌生。EventBus提供了一种有效的事件托管机制,以解决我们在项目开发中遇到的事件触发与捕获方面的困扰:基于FlashPlayer的事件冒泡机制严重依赖显示列表,在MVC架构中,很多类并非显示类,难以依赖冒泡机制。如何在各个类之间简单高效的传递事件,而又要尽量避免高耦合,是个难以解决的问题。SpringActionScript中也提供了EventBus的机制,而且它可以结合MetadataTag实现事件托管,尽量维持代码编写的优雅。让我们来看一个简单的例子:首先我们需要在XML配置中增加两个对象,它们将完成事件托管的功能实现。EventHandlerMetaDataPostProcessor类将根据Metadata标注确认哪些方法将用于事件侦听,而RouteEventsMetaDataPostProcessor将完成事件托管,即委托托管的类派发的事件交由EventBus处理然后我们在主代码中加载配置文件,这个过程与我们之前使用SpringActionScript的方式相同:package{importflash.display.DisplayObject;importflash.display.Sprite;importorg.springextensions.actionscript.context.support.XMLApplicationContext;importtest.ClassRef;publicclassEventBusTestextendsSprite{[Embed(source="config/application_context.xml",mimeType="application/octet-stream")]publicvarview:Class;publicvarapplicationContext:XMLApplicationContext;publicfunctionEventBusTest(){newClassRef;applicationContext=newXMLApplicationContext();applicationContext.addEmbeddedConfig(view);applicationContext.load();addChild(applicationContext.getObject("a")asDisplayObject);addChild(applicationContext.getObject("b")asDisplayObject);}}}然后有两个类A和B,注意A中将派发事件,交由EventBus托管,EventBus将执行B中的Handler,执行相应的操作,整个过程非常优雅的实现了松耦合,A和B彼此都不知道对方的存在,甚至也不需要知道EventBus的存在。A的代码,注意我们使用了[RouteEvents]来标注哪些事件将被托管:packagetest{importflash.display.Sprite;importflash.events.MouseEvent;[RouteEvents][Event(name="move",type="test.TestEvent")]publicclassAextendsSprite{publicfunctionA(){super();this.graphics.beginFill(0x000000,1);this.graphics.drawRect(0,0,100,100);this.graphics.endFill();x=10;y=10;addEventListener(MouseEvent.CLICK,startMove);}privatefunctionstartMove(e:MouseEvent):void{trace("Aclicked");varsEvt:TestEvent=newTestEvent(TestEvent.MOVE);sEvt.speed=10;dispatchEvent(sEvt);}}}B的代码,注意我们使用了[EventHandler(name="move")]来确定哪个事件将被后面的方法处理,注意该方法必须是Public的:packagetest{importflash.display.Sprite;publicclassBextendsSprite{publicfunctionB(){super();this.graphics.beginFill(0xFF0000,1);this.graphics.drawRect(0,0,100,100);this.graphics.endFill();x=110;y=10;}[EventHandler(name="move")]publicfunctiontrackHandler(e:TestEvent):void{x+=e.speed;trace("Bmove:"+e.speed);}}}