2011-07-21 22 views
0

フレックスのモジュールは一般的ですが、Flexモジュールのさまざまな使い方に関するドキュメントや例があまりにも稀有なのはなぜかわかりません。フレックスモジュールとアプリケーション間の通信

とにかく、この質問では、古典的な従業員/部署の例を取り上げます。私は、mx:TabNavigatorを含むmain.mxmlを持っています。各タブはs:ModuleLoaderによって読み込まれます。

テーブル:従業員{EMPID、のempName、DEPTID}、{Deparments DEPTID、DEPTNAME}

タブナビゲータは、従業員と呼ばれる(この例の場合)のみつのタブを含んでいます。私はEmployee.mxmlモジュールを持っています。そのモジュールには、従業員の詳細が入力されたデータグリッドがあります。私はgetEmployees($ deptID)関数を使用します。この関数は、あなたが推測しているように、特定の部門で働く従業員の配列を返します。

私はdepartmentNavigatorの外にdepartments.deptNameで設定されたdepartmentDropDownListを持っています。

私の目的は、DropDownListから特定の部門を選択するときにEmployeeモジュールをロードすることです。私はdeptIDを与えることができるDropDownListのchangeHandlerを持っています。

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

ここで、100万ドルの質問は、このdeptIDをEmployeesモジュールに渡す方法です。後者はのGetEmployees(DEPTID)を呼び出すemployee_creationCompleteHandlerがあります

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

creationCompleteが実行されたときにdeptIDが設定されることは本当に保証できません。サーバーの結果を待っているように聞こえるので、おそらくこれを処理する最良の方法ではありません。

モジュールのポイントはメインクラスにコンパイルするべきではないため、メインアプリケーションから完全なモジュールクラスを直接参照することです(ファイルサイズを縮小するため) /負荷時間)。

だから、あなたはインターフェイスを作成したいかもしれません。これにより、メインアプリケーションとモジュールの間に「実装契約」が作成されます。彼らは、あなたのプロジェクトが小さい場合には、グローバル変数がwondermousアイデアのように見えるけれども、ということ

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 
} 

注:それはその後、あなたのモジュールはこのような何かのコードを持っているかもしれません。この

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

のようになります。に入るのは非常に悪い習慣です。これらのクラスから始まるプロジェクトを修復することはほとんど不可能であり、変数へのアクセス権を持つ数百または数千のクラスのどれが間違った方法で変更しているのかを誰も正確に把握できないほどに成長します間違った時間。

モジュールがグローバル変数を使用したくないのは、モジュールが定義を超えて戦い始めたときに本当に悪い問題を引き起こす可能性があるからです。

+0

説明的で正確な解決策。 +1 –

+1

しかし、モジュールの使用を開始する場合(アプリケーションアーキテクチャが複雑になっていることを意味します)、アプリケーションフレームワークを使用してこの問題を解決することをお勧めします。 [Parsley](http://www.spicefactory.org/parsley/)と[RobotLegs](http://www.robotlegs.org/)は、いくつかの問題を解決する依存性注入を行う2つの非常に優れたフレームワークですコード行。 –

+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:IEmployeeInterfaceとして* = employeeModule.child;' – shailenTJ

0

@J_A_XモジュールでRobotlegsをそのまま使用することはできませんでした。たとえそうであってはならないにしても、何かがセキュリティの文脈に酔いしれているようです。自分のニーズはかなり基本的であっても、Joel HooksのModuleContextを使って正しく動作させる必要がありました。

+0

あなたはコメントがあったはずの回答を追加しました... –

+0

回答を追加するのは簡単で、小さな「コメント」リンクを見つけるのはしばらく時間がかかりました。 –

1

我々はケアンゴームV2を使用してこの問題を解決しました。それをActionScriptのメッセージバスと考えてください。 departmentDropDownList_changeHandlerメソッドでは、IDをペイロードとしてDeptChangedイベントを作成し、それをバス上でそのメッセージタイプのすべてのサブスクライバに送信します。それは私たちのためにはかなりうまくいっていましたし、物事をより多くのイベント駆動型にしました。

関連する問題