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クラスを書くとき、私はこの振る舞いを見ていないので、基本的に私の愚か:)
、答えを得ました。
ありがとうございます。
これを行うことで基本的にループが作成されました。アプリケーションを初期化しようとします。私はタクテクに同意する、あなたは停止する必要はありませんし、作成を完了ディスパッチする必要はありません。 init()を押すたびにコンポーネントをビュースタックに追加する必要があります。そのため、プロパティの設定はうまくいくはずです。 – Jeremy
前述のコードを削除する前に、同じイベントをディスパッチしていた同じコンポーネントから、同じイベントによってトリガーされた同じ関数からディスパッチしていました。したがって、無限ループ。 – Jeremy