这应该不算是一个很新的技术,但绝对是一个很有用的技术,这是我在前一个公司工作时学到的,当时实现的是对php页面通过路由实现动态跳转。没想到现在这个项目又将用到。当我们的网站页面很多,需要的跳转很多,而我们又需要动态地在主页面中加载子页面时,就将用到这个技术。我们现在这个项目前台由FLEX实现,整个系统可能只由几个application组成,所有的功能点都由module实现,而module本身无法实现各module间的跳转,只能通过application实现对各个module的动态加载来达到跳转的功能。而一个项目中可能有上千个module,公司的每个人可能会分到上百个module乃至几百个module的任务。所有的这些module如果不用路由技术,那么每次跳转都要能过触发一个不同的函数来实现,这样每一个application就会有几百个这样的跳转函数,想想那有多么恐怖吧,而且可维护性将变得极其差。
如果我们使用了路由技术,那情况就会变得大不一样了,路由技术的原理其实很简单,就是通过字符串的拼接,拼接出一个我们需要跳转的url,通过传递不同的参数,我们便可达到跳转到不同页面的目的。而在我们现在这个项目中,为了达到动态地在application加载module的目的,我把实现跳转的函数从
application移到了module,由各个module自己决定自己要跳转的目的地址,各个module把组装完整的url传递给application,这样在application中只要有一个函数便可实现页面跳转的功能。从几百个函数到一个函数,我们的application将减少几千行代码。最有利的还不是这个,由于把页面跳转的任务权利分到了各个module,这样各个模块内的module将变得更加的独立,每个人只需把自己的module做好便可以了,不用去考虑整个系统。而且系统的集成将变得极其简单,维护也将变得更为独立,更不会出现改动了一个module而牵一发而动全身的情况。
由此,在我们的application中,如在mainFrame.mxml中,只需定义一个实现跳转的函数
如:
public function jumpTo(toUrl:String):void
{
m1.url=toUrl;
m1.loadModule();
}
在各个module中,必须要把url完全组装好,包括需要传递类似ID的参数的情况,然后调用application中的jumpTo()函数便可。
如,在我的一个module中点击修改按钮,在这个module中,加一个函数
public function displayUpdate():void
{
var fromTable:String=this.DG.selectedItem.fromTable as String;
if(fromTable=="large")
{
var url:String = "eqm/updateLarge.swf?eqmID="+ this.DG.selectedItem.eqmID as
String;
}
else if(fromTable=="small")
{
var url:String="eqm/updateSmall.swf?eqmID="+this.DG.selectedItem.eqmID as
String;
}
this.parentApplication.jumpTo(url);
}
这样就把实现跳转的任务分配到了各个module,由各个module自已决定跳转!
但这样之后还可能会报一个
FLEX:TypeError: Error #1034: 强制转换类型失败 的错误
这时,在application中加上:
import mx.managers.DragManager;
import mx.managers.IPopUpManager;
private var dragManager : DragManager;
private var popUpManager : IPopUpManager;
问题便会得到解决,具体原因如下:(原因转自一台湾网站,我改成了简体中文)
属于ModuleLoader shared code problem.
当Module中使用managers时(如PopUpManager,DragManager,
HistoryManager等)则可能出现这个问题(当application里在loader之前没有引入这些manager的引用时)。
manager的方法是静态方法,整个应用程序中创建了一个该manager接口的singleton实例,但module仅在自己的 Application domain中使用该单例, 当多个module使用同一个单例,manager且main
application没有使用时,就会出现这个空对象应用问题:第一个引入某manager的module不能将该manager接口的singleton跟其他module共享,其他module调用该Manager的方法时,应用程序不会再创建该manager接口的实例,这个module就无法引用到该manager接口的实例,就出现了空对象引用问题.