如何在flex中将数据从一个组件传递到另一个组件

时间:2012-10-16 15:49:17

标签: flex property-injection

我有一个名为EmployeeResult的类,我从服务中获取响应。在resulthandler里面,我得到了一系列的员工,比如姓名,身份,年龄等。我在employeeView.mxml文件中有一个dataGrid。在employeeView.mxml文件中,我有一个ArrayCollection,它是datagrid的数据提供者。我想从EmployeeResult文件中更新该arraycollection。在使用Cairngorm框架时,我使用了singleton中的arraycollection来实现目标。在配合框架的情况下,我使用了propertyinjector标签。但是,如果没有任何框架,我如何在我的案例中实现这一目标。如何在不使用框架或单一类的情况下实现属性注入。

2 个答案:

答案 0 :(得分:1)

继续上一个问题:How to listen to events inside the child component dispatched by the parent component,您只需发送一个包含该员工列表的自定义事件,并通知整个应用程序它的到来。

这样的事情:

private function handleMyEmployeeResults(event:ResultEvent):void {
    var employees:IList = EmployeeResult(event.result).employeeList;
    dispatchEvent(new EmployeeEvent(EmployeeEvent.LIST_LOADED, employees, true));
}

由于这是一个服务结果处理程序,我们可以假设它的类实例不是视图,因此它不在显示列表中,这就是事件无法冒泡的原因。为解决这个问题,我们可以直接在stage上发送活动。

FlexGlobals.topLevelApplication.stage.dispatchEvent(
    new EmployeeEvent(EmployeeEvent.LIST_LOADED, employees)
);

您的应用程序中的任何视图现在都可以侦听此事件并相应地设置其属性:

//inside View1
stage.addEventListener(EmployeeEvent.LIST_LOADED, handleEmployeesLoaded);

private function handleEmployeesLoaded(event:EmployeeEvent):void {
    myDataGrid.dataProvider = event.employees;
}

//inside View2
stage.addEventListener(EmployeeEvent.LIST_LOADED, handleEmployeesLoaded);

private function handleEmployeesLoaded(event:EmployeeEvent):void {
    myOtherKindOfList.dataProvider = event.employees;
    myFirstEmployeeLabel.text = 
        event.employees[0].firstname + event.employees[0].lastname;
}

另一种更直接的方法是使用Application作为单身人士。在主应用程序上创建可绑定属性employeeList。现在在结果进入时设置其值:

private function handleMyEmployeeResults(event:ResultEvent):void {
    var employees:IList = EmployeeResult(event.result).employeeList;
    FlexGlobals.topLevelApplication.employeeList = employees;
}

现在,您可以从应用程序的任何位置绑定到此属性。

<View1>
    <s:DataGrid dataProvider="{FlexGlobals.topLevelApplication.employeeList}" />
</View1>

<View2>
    <s:List dataProvider="{FlexGlobals.topLevelApplication.employeeList}" />
</View2>

虽然这种方法具有易于实现的优点,但它具有Singleton的所有缺点(例如,可测试性差)。

答案 1 :(得分:0)

鉴于您一直在问的问题类型,您确实应该考虑使用RobotlegsMate这样的框架。它们为您提供了将应用程序连接在一起的工具,没有可怕的黑客攻击,这会限制您的灵活性或长期使维护变得复杂。

查看我之前的回答here,了解没有框架,Mate和Robotlegs完成的同一项目的链接。