0

アイテム レンダラー (メイン アプリケーション ファイル/ルートの子) からカスタム イベントをディスパッチしようとしています。

Main.mxml のコード:

<s:List id="movieGrid"itemRenderer="views.MovieRenderer" dataProvider="{new ArrayCollection()}">
    </s:List>

<s:Group width="100%" height="100%" bottom="60">
            <views:DetailedViewInfo id="detailed" includeIn="MoviePage" />
    </s:Group>

レンダラー (クリックされたもの):

MyEventDispatcher.Dispatcher.dispatchEvent(new MovieClickEvent(MovieClickEvent.CLICKED, data));

DetailedViewInfo (作成完了):

MyEventDispatcher.Dispatcher.addEventListener(MovieClickEvent.CLICKED, clickHandler);

MyEventDispatcher:

package events
{
    import flash.events.EventDispatcher;

    public class MyEventDispatcher
    {   
        public static var Dispatcher:EventDispatcher = new EventDispatcher();
    }
}

イベント:

package events
{
    import flash.events.Event;

    public class MovieClickEvent extends Event
    {
        public function MovieClickEvent(type:String, theMovieData:Object, bubbles:Boolean=true, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            this._result = theMovieData;
        }

        public function get result():Object
        {
            return this._result;
        }

        override public function clone():Event
        {
            return new MovieClickEvent(type, result, bubbles, cancelable)
        }

        public static const CLICKED:String = "MovieClickEvent.CLICKED";

        private var _result:Object;

    }
}

Main.mxml でイベントを正常にリッスンできますが、Main.mxml の子でもある SkinnableContainer - "DetailedViewInfo" でもイベントを検出する必要があります。

それは彼の可能性ですか?関連するすべてのイベント/クラスをインポートしてみましたが、宣言についても同じです。Main.mxml のイベントリスナーをコメントアウトしても動きません。DetailedViewInfo の項目レンダラーに宣言を追加しようとしましたが、理解できるエラーなしでアプリケーションがクラッシュします。

誰かがこれをどのように行うべきかを説明してもらえますか? アプリケーションのいたるところでカスタム イベントを使用していますが、これまでにこのようなことはありませんでした。どんな助けでも大歓迎です!

4

1 に答える 1

2

イベントがディスパッチされたにイベントリスナーを追加しているようです。そこにincludeInステートメントがあるようです。これは、コンポーネントがすぐに作成されるのではなく、状態に入っDetailedViewInfoたときにのみ作成されることを意味します。MoviePageコンポーネントが作成され、イベントリスナーがアタッチされる前に、イベントがディスパッチされる場合があります。

この問題を簡単に解決するには、 を使用せずincludeInに、現在の状態に応じてコンポーネントの可視性を設定します。

<views:DetailedViewInfo id="detailed" visible="false" includeInLayout="false"
    visible.MoviePage="true" includeInLayout.MoviePage="true" />

ただし、これに頼る必要がある場合は、アーキテクチャを確認することをお勧めします。残念ながら、私はあなたの現在のアーキテクチャを知らないので、それ以上のことは言えません。

于 2012-08-20T21:47:12.200 に答える