a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 103|回复: 0

[综合] 思科认证辅导之谈谈页面跳转的路由技术

[复制链接]
发表于 2012-8-3 20:03:30 | 显示全部楼层 |阅读模式
思科认证辅导之谈谈页面跳转的路由技术% k! \( y% Y$ L+ g( b) ]3 Y' o3 a( X
这应该不算是一个很新的技术,但绝对是一个很有用的技术,这是我在前一个公司工作时学到的,当时实现的是对php页面通过路由实现动态跳转。没想到现在这个项目又将用到。当我们的网站页面很多,需要的跳转很多,而我们又需要动态地在主页面中加载子页面时,就将用到这个技术。我们现在这个项目前台由FLEX 实现,整个系统可能只由几个 application组成,所有的功能点都由module实现,而module本身无法实现各module间的跳转,只能通过application实现对各个module的动态加载来达到跳转的功能。而一个项目中可能有上千个module,公司的每个人可能会分到上百个module乃至几百个 module的任务。所有的这些module如果不用路由技术,那么每次跳转都要能过触发一个不同的函数来实现,这样每一个application就会有几百个这样的跳转函数,想想那有多么恐怖吧,而且可维护性将变得极其差。/ V( m% V. L. T4 w! O% V9 |: b* n
如果我们使用了路由技术,那情况就会变得大不一样了,路由技术的原理其实很简单,就是通过字符串的拼接,拼接出一个我们需要跳转的url,通过传递不同的参数,我们便可达到跳转到不同页面的目的。而在我们现在这个项目中,为了达到动态地在application加载module的目的,我把实现跳转的函数从 application移到了module,由各个module自己决定自己要跳转的目的地址,各个module把组装完整的url传递给 application,这样在application中只要有一个函数便可实现页面跳转的功能。从几百个函数到一个函数,我们的application 将减少几千行代码。最有利的还不是这个,由于把页面跳转的任务权利分到了各个module,这样各个模块内的module将变得更加的独立,每个人只需把自己的module做好便可以了,不用去考虑整个系统。而且系统的集成将变得极其简单,维护也将变得更为独立,更不会出现改动了一个module而牵一发而动全身的情况。; i/ Y% G- Z( r: w
由此,在我们的application中,如在mainFrame.mxml中,只需定义一个实现跳转的函数. d" {% s; e4 z' F  O: Z. q3 E0 K1 S
如:7 H3 `6 N; O7 y! y
public function jumpTo(toUrl:String):void1 |& H. m  U2 V  ]
{- a$ Z- \0 F& z. h
m1.url=toUrl;6 Y$ k" C* Y+ I
m1.loadModule();
: \( B. {6 f' h1 y+ b; s& G  ]}
9 q4 [" L+ _7 K. @- a/ o& Z在各个module中,必须要把url完全组装好,包括需要传递类似ID的参数的情况,然后调用application中的jumpTo()函数便可。5 F+ \- U  P/ A$ P# b/ O# A; N
如,在我的一个module中点击修改按钮,在这个module中,加一个函数
8 p  y0 l2 o2 f' L0 h4 W6 wpublic function displayUpdate():void# K& Y# v! v( }- ~! C9 O% `" u: @
{
9 c+ h; N/ k; \, K  `# d) U( B1 r& R$ @, |var fromTable:String=this.DG.selectedItem.fromTable as String;
( y- d* ^% Y9 c" x2 ?, J* mif(fromTable==“large”)
2 {6 e  h% X8 Z. x) }{
6 {& t& b4 j( dvar url:String = “eqm/updateLarge.swf?eqmID=”\+ this.DG.selectedItem.eqmID as String;8 H0 E- `. I/ w: p7 O( K6 L5 E
}( o3 b/ c: e* B, j4 d
else if(fromTable==“small”); U+ K$ j, a$ w9 ?( P2 Y+ ~+ ~3 y
{2 e( Y  E3 b) c- R+ B# U
var url:String=“eqm/updateSmall.swf?eqmID=”+this.DG.selectedItem.eqmID as String;
  `" e( K/ |$ q/ j' v: k6 m% o}; K+ g  i0 l& T* X! D) \

& p$ s# Q! ^4 x, |
4 V$ _7 I3 r, K% @4 |+ U% B3 d" S& ^this.parentApplication.jumpTo(url);
. p4 L; B  B' W' x}
7 P2 S/ ]5 e: h4 z5 S/ A# L这样就把实现跳转的任务分配到了各个module,由各个module自已决定跳转!9 T) L1 S2 K, A4 p5 R* i
但这样之后还可能会报一个
; R7 P& \9 W; t; N/ x* N0 HFLEX:TypeError: Error #1034: 强制转换类型失败 的错误
$ c: H1 i$ A  D% u+ a3 Y6 P这时,在application中加上:
# @- N! o2 O. B% u8 Z: n! c( iimport mx.managers.DragManager;& k" R* \2 v$ O" P6 c0 l4 k
import mx.managers.IPopUpManager;
& _7 |$ J1 x$ R5 \8 ]! Xprivate var dragManager : DragManager;& Y) q5 Q" @" K' I; }
private var popUpManager : IPopUpManager;- x% V( J; {% c" a! W! E
问题便会得到解决,具体原因如下:(原因转自一台湾网站,我改成了简体中文)) t4 A4 [" j; k- e; D7 `
属于ModuleLoader shared code problem.. {; c# x  s1 n% S9 j
当Module中使用managers时(如PopUpManager,DragManager, HistoryManager等)则可能出现这个问题(当application里在loader之前没有引入这些manager的引用时)。. X& b" i" T; ]8 Q/ ]* H
manager的方法是静态方法,整个应用程序中创建了一个该manager接口的singleton实例,但module仅在自己的 Application domain中使用该单例, 当多个module使用同一个单例,manager且main application没有使用时,就会出现这个空对象应用问题:第一个引入某manager的module不能将该manager接口的 singleton跟其他module共享,其他module调用该Manager的方法时,应用程序不会再创建该manager接口的实例,这个 module就无法引用到该manager接口的实例,就出现了空对象引用问题.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-26 23:07 , Processed in 0.211482 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表