0

サービスからの応答を取得する EmployeeResult という名前のクラスが 1 つあります。resulthandler 内で、名前、ID、年齢などの従業員の配列を取得しています。employeeView.mxml ファイル内に 1 つの dataGrid があります。employeeView.mxml ファイル内には、データグリッドへのデータプロバイダーである ArrayCollection があります。EmployeeResult ファイル内からその arraycollection を更新したいと考えています。Cairngorm フレームワークを使用する場合、シングルトン内で arraycollection を使用して目標を達成しました。mate フレームワークの場合、propertyinjector タグを使用しました。しかし、私の場合、フレームワークなしでこの目的を達成するにはどうすればよいですか。フレームワークやシングルトン クラスを使用せずにプロパティ インジェクションを実現する方法。

4

2 に答える 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>

このアプローチには、実装が非常に簡単であるというメリットがありますが、Singleton のすべての欠点があります (たとえば、テストしにくいなど)。

于 2012-10-16T16:03:08.007 に答える
0

あなたが尋ねてきた質問の種類を考えると、RobotlegsMateなどのフレームワークを検討する必要があります。それらは、柔軟性を制限したり、長期的なメンテナンスを複雑にしたりする恐ろしいハックなしで、アプリケーションを結び付けるためのツールを提供します。

フレームワークなし、Mate、および Robotlegs を使用して行われた同じプロジェクトへのリンクについては、こちらの以前の回答を確認してください。

于 2012-10-16T18:00:35.340 に答える