0

次のカスタム イベントがあります。

package com.un.photoManager.events
{
import flash.events.Event;

import mx.collections.ArrayCollection;


public class CreateAlbumFolderEvent extends Event
{
    // when creating an album, we need to know which albumfolder to put it in, 0 is the default group;
    public var albumFolderID:int = 0;
    public var name:String;

    public function CreateAlbumFolderEvent(type:String, name:String, albumFolderID:int = 0, cancelable:Boolean = false)
    {
        super(type, true, cancelable);
        this.name = name;
        this.albumFolderID = albumFolderID;

    }

}
}

イベントは、次のコードを使用してポップアップから呼び出されます。

protected function handleCreate():void
        {
            var event:CreateAlbumFolderEvent;
            var selectedItemType:String;

            if (folderAlbum == CREATE_ALBUM)
            {
                event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM, newAlbumFolder.text, selectedAlbumFolderID);
                selectedItemType = "Album";
            }
            else
            {
                event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM_FOLDER, newAlbumFolder.text);
                selectedItemType = "Folder";
            }
            dispatchEvent(event);
            FolderBrowse.lastSelectedItemType = selectedItemType;
            PopUpManager.removePopUp(this);
        }

私がやろうとしているのは、返された応答をキャプチャすることです。これは、応答を示す Charles のスクリーンショットです。Result 値は、実行後に使用できるように探しているものですdispatchEvent(event);

チャールズのスクリーンショット

私はブログとフォーラムの投稿を見て数時間これに取り組んできましたが、解決策を得ることができませんでした. 理想的には、コード サンプルがあればよいのですが、現時点ではどんな助けも歓迎します。

4

2 に答える 2

0

ええと

より重要な質問は、イベントをどのように聞いていますか? ポップアップからイベントをディスパッチしているため、ポップアップの範囲外でこのイベントに到達しようとしていると想定します。

次の点を考慮することが重要です。

一般に、イベントは期待どおりに機能しますが、1 つのバリエーションがあります。ポップアップからのイベントは、継承チェーンを下ってメイン アプリケーション ルートに移動しません。

代わりに、ポップアップ ウィンドウからディスパッチされたイベントはウィンドウ ルートで終了します。これは、ポップアップ マネージャがポップアップ ウィンドウの親であるためです。

その結果、ポップアップで開始されたイベントは、メイン アプリケーションのオブジェクトの最終的な親であるメイン アプリケーション ページにバブル アップしません。

Flex アプリケーション内のポップアップは、アプリケーション コンテナの子ではなく、SystemManger の子です。

つまり、単純にイベントをディスパッチすると、システム マネージャにのみ到達し、アプリケーション階層の下位でリッスンしようとするもの (つまり、すべて) はこれを受信しません。

この問題には多くの解決策があり、アーキテクチャ (推奨されるフレームワード (パセリ、ロボレッグ)) に応じて変更されますが、今のところ、単純にリスナーを Application.application.systemManager に追加すると、次のイベントを受け取るはずです:

Application.application.systemManager.addEventListener(EventConstants.CREATE_ALBUM_FOLDER, [YOUR HANDLER]);

イベントをディスパッチするときに、イベントを BUBBLE する必要がある場合もあります。

ただし、これはポップアップからのイベントを処理するための理想的なソリューションではありません。ポップアップにモデルを挿入して、メッセージを発行できるようにすることを検討することをお勧めします。

それが役立つことを願っています

于 2012-06-15T20:09:13.847 に答える
0

サブクラスで Event.clone() メソッドをオーバーライドする必要があります。clone() メソッドは、 type プロパティとクローンの新しいプロパティを設定することにより、イベント オブジェクトのクローン コピーを返します。通常、clone() メソッドを定義して、new 演算子で作成されたイベント インスタンスを返します。

package sample
{
    import flash.events.Event;
    import mx.collections.ArrayCollection;

    public class CustomEvent extends Event
    {

        public static var DATA_LOADED:String = "dataLoaded";

        private var _data:ArrayCollection;

        public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, data:ArrayCollection=null)
        {
            super(type, bubbles, cancelable);
            _data = data;
        }

        override public function clone():Event
        {
            return new CustomEvent(type, bubbles, cancelable, data);
        }

        public function get data():ArrayCollection
        {
            return _data;
        }
    }
}
于 2012-06-16T13:03:37.223 に答える