2011-07-21 60 views
0

好的,Flex中的模塊很流行,但我不知道爲什麼關於Flex模塊的不同用法的文檔和示例如此稀少。Flex模塊和應用程序之間的通信

無論如何,對於這個問題,我將採取經典的員工/部門的例子。我有一個包含mx:TabNavigator的main.mxml。每個選項卡都由s:ModuleLoader加載。

表:員工{EMPID,empName,DEPTID},{部門工作人員DEPTID,DEPTNAME}

的標籤導航器中只包含一個名爲Employee標籤(在我們的例子)。我有一個Employee.mxml模塊。在該模塊中,我有一個填充了員工詳細信息的數據網格。我使用getEmployees($ deptID)函數。您可能會猜到,此功能會返回一組在特定部門工作的員工。

在TabNavigator之外,我有一個departmentDropDownList填充了departments.deptName。

我的目標是加載Employee模塊,當我從DropDownList中選擇一個特定的部門。我有一個可以給我deptID的DropDownList的changeHandler。

protected function departmentDropDownList_changeHandler(event:IndexChangeEvent):void 
{ 
MyDeptID=departmentDropDownList.selectedItem.deptID; 
//var ichild:*=employeeModule.child as IModuleInfo; 
} 

現在,百萬美元的問題是:如何將此deptID傳遞給Employees模塊。後者的優點是調用裝getEmployees的employee_creationCompleteHandler(DEPTID):

protected function EmployeesDg_creationCompleteHandler(event:FlexEvent):void 
// I only need to get the deptID from the departmentDropDownList outside the Employee module. 
// If I could create a global variable deptID, that would be great! 
getEmployeessResult.token=employeeService.getEmployeess(deptID); 
} 

我試圖使用[綁定]變量,但沒有成功。

我希望你的建議。

回答

3

當creationComplete運行時,您無法真正保證設置deptID - 這聽起來像是您在等待服務器結果 - 所以這可能不是處理它的最佳方式。

您需要小心的事情之一是直接引用主應用程序中的完整模塊類,因爲模塊的要點是您不應該將模塊中的類編譯到主類中(以減小文件大小/加載時間)。

所以你可能想要做的是創建一個接口。這會在主應用程序和模塊之間創建一個「契約」,而無需攜帶所有的實現代碼。這可能是這個樣子

public interface IEmployeeModule { 
    function set deptID(value:int):void; 
} 

然後,你的模塊可能有一些代碼是這樣的:

protected var _deptID:int; 
public function set deptID(value:int):void { 
    _deptID = value; 
    var token:AsyncToken=employeeService.getEmployeess(deptID); 
    token.deptID = value;//in case department id changes, you can determine if you still care 
} 

需要注意的是,雖然全局變量似乎是一個wondermous想法時,你的項目是小,他們是一種非常不好的習慣。修復一個以這些開始的項目幾乎是不可能的,然後發展到沒有人能夠確切地知道成千上萬個有訪問變量的類的哪一個正在以錯誤的方式改變它在不合時機。

您特別不希望在模塊中使用全局變量,因爲當模塊開始對定義進行爭奪時,它們會導致非常糟糕的問題。

+0

一個描述性的和精確的解決方案。 +1 –

+1

非常好的答案,但是,如果您開始使用模塊(通常意味着您的應用程序體系結構變得越來越複雜),我建議您使用應用程序框架來幫助您解決此問題。 [Parsley](http://www.spicefactory.org/parsley/)和[RobotLegs](http://www.robotlegs.org/)是兩個很好的依賴注入框架,可以解決一些問題代碼行。 –

+0

非常感謝!您的輸入是非常有用的。我結合了這個網站的信息:http://www.flex-tutorial.fr/2009/10/16/flex-modules-utiliser-des-interfaces-actionscript-pour-communiquer-avec-lapplication/並且適應了我的項目。 順便說一句,在我的main.mxml中,我不得不在DropDownList的changeHandler函數中使用下面的代碼。這是你怎麼做的嗎?上面的鏈接是舊的,我不確定該方法是用於Flex3還是用於Flex4。 'var ichild:* = employeeModule.child作爲IEmployeeInterface;' – shailenTJ

0

@J_A_X我沒有使用Robotlegs開箱即用模塊的好運氣。看起來有些東西在安全環境下變得詭異,即使它不應該。儘管我的需求相當基礎,但我必須使用Joel Hooks的ModuleContext才能使其正常工作。

+0

你添加了一個答案,它應該是一個評論... –

+0

是的,我花了一段時間找到一個小的「評論」鏈接,其中添加答案很容易找到。 –

1

我們使用Cairngorm v2解決了這個問題。把它看作是ActionScript的消息總線,是其中的一種。在您的departmentDropDownList_changeHandler方法中,我們將創建一個ID爲負載的DeptChanged事件,並將其發送到總線上的任何和所有訂戶。它對我們來說工作得非常好,並且讓事情更加受事件驅動,在一些圈子中本身被認爲是一件好事。

相關問題