Flex模块与应用程序之间的通信

时间:2011-07-21 13:17:31

标签: flex actionscript-3 module flex4

好的,Flex中的模块很受欢迎,但我不知道为什么有关Flex模块不同用途的文档和示例如此稀缺。

无论如何,对于这个问题,我将采用经典的员工/部门示例。我有一个main.mxml包含一个mx:TabNavigator。每个选项卡都由s:ModuleLoader加载。

表:员工{empID,empName,deptID},Deparments {deptID,deptName}

Tab Navigator只包含一个名为Employee的选项卡(对于我们的示例)。我有一个Employee.mxml模块。在该模块中,我有一个填充了Employee详细信息的数据网格。我使用getEmployees($ deptID)函数。正如您可能猜到的,这个函数会给我一系列在特定部门工作的员工。

在TabNavigator之外,我有一个使用departments.deptName填充的departmentDropDownList。

我的目标是在从DropDownList中选择特定部门时加载Employee模块。我有一个DropDownList的changeHandler,可以给我deptID。

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

现在,百万美元的问题是:如何将此deptID传递给Employees模块。后者有一个employee_creationCompleteHandler,它调用getEmployees(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);
}

我试图使用[Bindable]变量,但没有成功。

感谢您的建议。

3 个答案:

答案 0 :(得分:3)

你无法保证在createComplete运行时会设置deptID - 听起来好像你在等待服务器结果 - 所以这可能不是处理它的最好方法。

您需要注意的一件事是直接从主Application中引用完整的Module Class,因为模块的重点是您不应该在模块Class中编译到主Class中(以减小文件大小/加载时间)。

所以你可能想要做的是创建一个接口。这在主应用程序和模块之间创建了一个“契约”,而没有携带所有实现代码。这可能看起来像这样

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
}

请注意,虽然全局变量在项目规模较小时似乎是一个奇怪的想法,但它们是一个非常糟糕的习惯。修复一个以这些开头的项目几乎是不可能的,然后增长到没有人能够确切地知道有数百或数千个有权访问变量的类中的哪一个正在以错误的方式改变它的情况。错误的时间。

你特别不想在模块中使用全局变量,因为当模块开始争夺定义时,它们会导致非常糟糕的问题。

答案 1 :(得分:1)

我们使用Cairngorm v2解决了这个问题。可以将其视为ActionScript的消息总线,其中包括几个。在您的departmentDropDownList_changeHandler方法中,我们将创建一个DeptChanged事件,其ID为有效负载,并将其在总线上发送给该消息类型的任何和所有订户。它对我们来说非常有效,并且使事情更加受事件驱动,在某些圈子里它本身就被视为一件好事。

答案 2 :(得分:0)

@J_A_X我没有好运使用Robotlegs开箱即用的模块。似乎有些事情在安全环境中变得不稳定,即使它不应该。我不得不使用Joel Hooks的ModuleContext使其正常工作,即使我的需求相当基本。