2012-03-01 2 views
2

MXMLスキン可能コンポーネントであるshopViewというカスタムコンポーネントがあります。 ShopControllerというコントローラクラスがあり、このコンポーネントをポップアップで表示したり、コンポーネントに表示されている情報を更新したりします。flex 4 - dispatchEventがcreationCompleteを再帰的にトリガーする理由

コントローラから作成した後、このShopViewのサブコンポーネントの一部をマニフェストしたい後ShopViewが作成されます(のcreationComplete()イベント)だから、

は、私はインターンは、いくつかの初期化プロセス

creationComplete="init(event)" 

のinit()関数

にないイベントリスナーを添付しています_shop

 _shop.addEventListener(FlexEvent.CREATION_COMPLETE,onShopCreated); 

* コントローラクラスから別の創造の完全なイベントをアタッチ0

 private function init(event:FlexEvent):void{ event.stopImmediatePropagation(); initMenus(); initSlots(); dispatchEvent(event); } 

ShopViewのインスタンスは、あなたがそこに、init()関数を見れば私は、*今

ですイベントの伝播を停止し、初期化処理を行った後、イベントをディスパッチします(店舗コントローラーの場合は残りのジョブを行います)

今、このi ShopViewのcrationCompleteイベントが再帰的に呼び出されるため、アプリケーションがクラッシュします。私はdispatchEventが他のlisternerに伝播すると考えていましたが、同じコンポーネントに戻って伝播しているようです。

私は、init()関数からe.stopImmediatePropagation()およびdispatchEvent(event)行を削除して修正しました。しかし、なぜこのように起こっているのか知りたいですか?

mxml/flexコンポーネントの既知の問題ですか?それとも期待される行動ですか?

更新:私は以下で述べたように.asで同じことをしていません。私はI stopevent伝播をしては、ビジネスロジックに基づいてイベントをディスパッチの.asクラスを書くとき、私はこの振る舞いを見ていないので、基本的に私の愚か:)

、答えを得ました。

ありがとうございます。

+1

これを行うことで基本的にループが作成されました。アプリケーションを初期化しようとします。私はタクテクに同意する、あなたは停止する必要はありませんし、作成を完了ディスパッチする必要はありません。 init()を押すたびにコンポーネントをビュースタックに追加する必要があります。そのため、プロパティの設定はうまくいくはずです。 – Jeremy

+1

前述のコードを削除する前に、同じイベントをディスパッチしていた同じコンポーネントから、同じイベントによってトリガーされた同じ関数からディスパッチしていました。したがって、無限ループ。 – Jeremy

答えて

3

これは予想される動作です。

既存のイベントを再ディスパッチすると、同じイベントを2回ディスパッチできないため、dispatchEventが自動的にクローンを作成します。これにより、伝播関連のフラグはすべてクリアされます。

なぜこのような状況でCREATION_COMPLETEを再配布したいのですか?両方のハンドラーは、削除した2行がなくてもうまく機能します。

+0

私はそれをしました。なぜなら、現在のコードは意味がありません。なぜなら、これはまったく同じ方法で、イベントを停止して再ディスパッチせずに動作するからです。しかし、将来は、非同期関数を呼び出すために、ビジネスの観点から作成完了が完了しないコードを書くつもりで、応答を受け取った後で作成を完了する必要があるため追加しました。 –

+1

あなたがしなければならないことは、preInitialize中にコードを実行し、完了したらあなた自身のイベントを発生させ、そこからあなたのコードを実行することです。 creationCompleteには特定の意味があり、それをハイジャックするのは悪い考えです。 –

関連する問題