为了有一套好用的框架和组件改善开发环境,近期开始学习flex。因为之前几乎没有接触过flex,所以直接从FB4.6学起,直接开始用spark库。
自从7月份换了新工作接触到Robotlegs后,我就喜欢上这个框架,它非常自然、方便的解耦功能模块。所以学习flex第一步还是想继续使用Robotlegs框架,结果很快遇到了第一个问题。
问题1,使用contextView
在StartupCommand里添加组件,使用contextView.addChild报错,提示是spark里面废除了此方法,需使用addElement(现在想想,多大点事儿啊……当时确实太不了解flex,也不太了解Robotlegs。我当时的感觉应该和我妈用atm被吞卡差不多)。
其实解决方法很简单。在spark里,文档类——也就是<s:WindowedApplication>——是SkinnableContainer的子类,所以也是DisplayObjectContainer的子类,而Robotlegs框架里的contextView是DisplayObjectContainer类型,那么需要添加视图的时候很简单,这么做就好:
override public function execute():void { var container:SkinnableContainer = SkinnableContainer(contextView); var element:Panel = new Panel(); container.addElement(element); }
问题2,使用PopupManager
在Flex里,PopUpManager会把popup创建到contextView外面的显示列表中,所以robotlegs就无法获悉这个view是什么时候被加载的,也就无法适时创建mediator了。要解决这个问题,我们可以在需要的时候手工创建mediator,比如:
// 关联view和mediator时 mediatorMap.mapView(MyPopupView, MyPopupViewMediator, null, false, false); //禁用自动创建和自动移除 // 需要弹出popup时 var popup:MyPopupView = new MyPopupView(); PopUpManager.addPopUp(popup, contextView); mediatorMap.createMediator(popup);
需要移除popup的时候,可以在下面两种方法中任选一种:
mediatorMap.removeMediator(mediator); // 或 mediatorMap.removeMediatorByView(popup);
欢迎吐槽,共同进步