路由技术解决页面跳转问题

时间:2011-08-30

  引言

  页面跳转路由技术,算来并不是一个很新的技术,但却是一项有用的技术。在网站有很多需要跳转的页面,而我们又需要动态地在主页面中加载子页面时,就会用到这门技术。以我们公司现在这个项目为例,前台是由FLEX实现,整个系统可能只有几个application组成,所有的功能点均由module实现,而module本身无法实现各module之间的跳转,只能通过application实现对各个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等)可能出现这个问题。

  manager的方法是静态方法,整个应用程序中创建了一个该manager接口的singleton实例,但module仅在自己的 Application domain中使用该单例。当多个module使用同一个单例,manager且main application没有使用时,就会出现这个空对象应用问题:个引入某manager的module不能将该manager接口的singleton跟其他module共享,其他module调用该Manager的方法时,应用程序不会再创建该manager接口的实例,这个module就无法引用到该manager接口的实例,就出现了空对象引用问题。



  
上一篇:浅谈光纤视频传输爆发和高清监控
下一篇:解析RDS广播系统的设计和应用

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料