我有一个名为 EmployeeResult 的类,我从服务中获取响应。在结果处理程序中,我得到了一组员工,如姓名、身份证、年龄等。在employeeView.mxml 文件中有一个dataGrid。在employeeView.mxml 文件中,我有一个ArrayCollection,它是数据网格的数据提供者。我想从 EmployeeResult 文件中更新该数组集合。在使用 Cairngorm 框架时,我使用了单例中的 arraycollection 来实现目标。在 mate 框架的情况下,我使用了 propertyinjector 标签。但是在没有任何框架的情况下,我如何实现这个目标。如何在不使用框架或单例类的情况下实现属性注入。
问问题
357 次
2 回答
1
继续上一个问题:如何监听由父组件调度的子组件内部的事件,您可以简单地调度一个包含该员工列表的自定义事件,并通知整个应用程序它的到来。
像这样的东西:
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>
尽管这种方法具有非常容易实现的优点,但它也具有单例的所有缺点(例如,可测试性差)。
于 2012-10-16T16:03:08.007 回答