這應(yīng)該不算是一個很新的技術(shù),但絕對是一個很有用的技術(shù),這是我在前一個公司工作時學(xué)到的,當時實現(xiàn)的是對php頁面通過路由實現(xiàn)動態(tài)跳轉(zhuǎn)。沒想到現(xiàn)在這個項目又將用到。當我們的網(wǎng)站頁面很多,需要的跳轉(zhuǎn)很多,而我們又需要動態(tài)地在主頁面中加載子頁面時,就將用到這個技術(shù)。我們現(xiàn)在這個項目前臺由FLEX實現(xiàn),整個系統(tǒng)可能只由幾個application組成,所有的功能點都由module實現(xiàn),而module本身無法實現(xiàn)各module間的跳轉(zhuǎn),只能通過application實現(xiàn)對各個module的動態(tài)加載來達到跳轉(zhuǎn)的功能。而一個項目中可能有上千個module,公司的每個人可能會分到上百個module乃至幾百個module的任務(wù)。所有的這些module如果不用路由技術(shù),那么每次跳轉(zhuǎn)都要能過觸發(fā)一個不同的函數(shù)來實現(xiàn),這樣每一個application就會有幾百個這樣的跳轉(zhuǎn)函數(shù),想想那有多么恐怖吧,而且可維護性將變得極其差。
如果我們使用了路由技術(shù),那情況就會變得大不一樣了,路由技術(shù)的原理其實很簡單,就是通過字符串的拼接,拼接出一個我們需要跳轉(zhuǎn)的url,通過傳遞不同的參數(shù),我們便可達到跳轉(zhuǎn)到不同頁面的目的。而在我們現(xiàn)在這個項目中,為了達到動態(tài)地在application加載module的目的,我把實現(xiàn)跳轉(zhuǎn)的函數(shù)從
application移到了module,由各個module自己決定自己要跳轉(zhuǎn)的目的地址,各個module把組裝完整的url傳遞給application,這樣在application中只要有一個函數(shù)便可實現(xiàn)頁面跳轉(zhuǎn)的功能。從幾百個函數(shù)到一個函數(shù),我們的application將減少幾千行代碼。最有利的還不是這個,由于把頁面跳轉(zhuǎn)的任務(wù)權(quán)利分到了各個module,這樣各個模塊內(nèi)的module將變得更加的獨立,每個人只需把自己的module做好便可以了,不用去考慮整個系統(tǒng)。而且系統(tǒng)的集成將變得極其簡單,維護也將變得更為獨立,更不會出現(xiàn)改動了一個module而牽一發(fā)而動全身的情況。
由此,在我們的application中,如在mainFrame.mxml中,只需定義一個實現(xiàn)跳轉(zhuǎn)的函數(shù)
如:
public function jumpTo(toUrl:String):void
{
m1.url=toUrl;
m1.loadModule();
}
在各個module中,必須要把url完全組裝好,包括需要傳遞類似ID的參數(shù)的情況,然后調(diào)用application中的jumpTo()函數(shù)便可。
如,在我的一個module中點擊修改按鈕,在這個module中,加一個函數(shù)
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);
}
這樣就把實現(xiàn)跳轉(zhuǎn)的任務(wù)分配到了各個module,由各個module自已決定跳轉(zhuǎn)!
但這樣之后還可能會報一個
FLEX:TypeError: Error #1034: 強制轉(zhuǎn)換類型失敗 的錯誤
這時,在application中加上:
import mx.managers.DragManager;
import mx.managers.IPopUpManager;
private var dragManager : DragManager;
private var popUpManager : IPopUpManager;
問題便會得到解決,具體原因如下:(原因轉(zhuǎn)自一臺灣網(wǎng)站,我改成了簡體中文)
屬于ModuleLoader shared code problem.
當Module中使用managers時(如PopUpManager,DragManager,
HistoryManager等)則可能出現(xiàn)這個問題(當application里在loader之前沒有引入這些manager的引用時)。
manager的方法是靜態(tài)方法,整個應(yīng)用程序中創(chuàng)建了一個該manager接口的singleton實例,但module僅在自己的 Application domain中使用該單例, 當多個module使用同一個單例,manager且main
application沒有使用時,就會出現(xiàn)這個空對象應(yīng)用問題:第一個引入某manager的module不能將該manager接口的singleton跟其他module共享,其他module調(diào)用該Manager的方法時,應(yīng)用程序不會再創(chuàng)建該manager接口的實例,這個module就無法引用到該manager接口的實例,就出現(xiàn)了空對象引用問題.