谈页面跳转的路由技术

来源:互联网 发布:主机域名绑定 编辑:程序博客网 时间:2024/06/16 01:50

这应该不算是一个很新的技术,但绝对是一个很有用的技术,这是我在前一个公司工作时学到的,当时实现的是对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接口的实例,就出現了空对象引用问題.
參考資料:Flex sdk源码。

原创粉丝点击