-1

「私の「モデル」は、EventDispatcherを拡張するASクラスです。

MeetingInfoModel extends EventDispatcher

このクラスでは、カスタムイベントをブロードキャストします。

var eventObj:CustomEvent = new CustomEvent( CustomEvent.UPDATE_DOC_COUNTER );
        dispatchEvent( eventObj );

クラスのトップにメタデータタグを含めます。

[Event(name="updateDocCounter", type="com.fmr.transporter.events.CustomEvent")]

MXMLコンポーネントでこのイベントをリッスンしようとしています。

this.addEventListener( CustomEvent.UPDATE_DOC_COUNTER, onDocUpdate );

しかし、それはこのリスナーに到達することはありません。

私はこのような問題に何度も遭遇しましたが、私が理解していないイベントプロセスの重要な部分があると思います。

誰かが役立つ手がかりを提供できますか?

ありがとうございました!

アップデート:

以下のすべてのコメントに応えて(すべての回答に感謝します!):

  1. MeetingInfoModelは表示コンポーネントではないため、イベントのブロードキャストを担当する必要はありません。それは私が得ていなかった作品です!

私のコードは次のとおりです。MeetingInfoModelコンストラクターで、クラスメンバーの1つのコレクション変更イベントをリッスンします。

docsAndAttachmentsList.addEventListener( CollectionEvent.COLLECTION_CHANGE, updateDocsCounter );

そのハンドラーで、MXMLコンポーネント(表示階層の一部)が処理するイベントをブロードキャストしようとします。

private function updateDocsCounter( event:CollectionEvent ):void
    {           
        var eventObj:CustomEvent = new CustomEvent( CustomEvent.UPDATE_DOC_COUNTER );
        dispatchEvent( eventObj );
    }

MXMLコンポーネントに戻り、creationCompleteハンドラーからこのメソッドを呼び出します。

private function addListeners():void{
            MeetingInfoModel.getInstance().addEventListener( CustomEvent.UPDATE_DOC_COUNTER, onDocUpdate );
        }

MXMLコンポーネントのコレクション変更イベントをリッスンする必要があるようです。私はそれを試しましたが、うまくいきません:

MeetingInfo.getInstance().docsAndAttachmentsList.addEventListener( CollectionEvent.COLLECTION_CHANGE, updateDocsCounter );

なぜそれが機能しないのかわかりません。それが最善の解決策のようです。

完全なMeetingInfoModelクラスは次のとおりです。

[Bindable]
[Event(name="updateDocCounter", type="com.fmr.transporter.events.CustomEvent")]
public final class MeetingInfoModel extends EventDispatcher
{
    //Universal INFO
    public var generalInfo:GeneralInfoModel;
    public var meetingVO:MeetingVO = new MeetingVO();
    public var meetingId:String;

    public var bulletinBoardLiveMembers:ArrayCollection = new ArrayCollection();

    public var xmppServices:XMPPServices;

    public var declinedParticipantsGroup:ArrayCollection = new ArrayCollection();
    public var notJoinedParticipantsGroup:ArrayCollection = new ArrayCollection();
    public var conferenceRoomParticipantsGroup:ArrayCollection = new ArrayCollection();
    public var otherLocationParticipantsGroup:ArrayCollection = new ArrayCollection();

    [Bindable]
    public var documentList:ArrayCollection = new ArrayCollection();

    [BIndable]
    public var newAttachmentList:ArrayCollection = new ArrayCollection();
    public var docsAndAttachmentsList:ArrayCollection = new ArrayCollection();

    public var bulletinBoardMsgList:ArrayCollection = new ArrayCollection();

    private var _participantList:ArrayCollection = new ArrayCollection();
    public var dismissedMeetingIDs:Array = [];
    public var visibleToastWindows:Array = [];

    public function MeetingInfoModel()
    {
        generalInfo = GeneralInfoModel.getInstance();
        xmppServices = XMPPServices.getInstance();
        _participantList.addEventListener(CollectionEvent.COLLECTION_CHANGE, allParticipantsChangeHandler);
        bulletinBoardLiveMembers.addEventListener(CollectionEvent.COLLECTION_CHANGE, bulletinBoardLiveMembersChangeHandler);
        docsAndAttachmentsList.addEventListener( CollectionEvent.COLLECTION_CHANGE, updateDocsCounter );
    }

    private static var model:MeetingInfoModel = null;

    public static function getInstance():MeetingInfoModel
    {
        if (model == null)
        {
            model = new MeetingInfoModel();
        }
        return model;
    }

    /** 
     * The handler for the collection change event of the docsAndAttachmentsList collection. 
     * 
     * We use it to manually update the counter on the Docs tab.
     */
    private function updateDocsCounter( event:CollectionEvent ):void
    {           
        var eventObj:CustomEvent = new CustomEvent( CustomEvent.UPDATE_DOC_COUNTER );
        dispatchEvent( eventObj );
    }

    public function displayToastForThisMeeting(meetingID:Number):Boolean
    {
        //trace("model::meetingID = " + meetingID);
        var doDisplayToast:Boolean = false;
        var containsMeetingID:Boolean = false;
        //the first one
        if(dismissedMeetingIDs.length == 0)
        {
            //trace("dismissedMeetingIDs.length = 0");
            doDisplayToast = true;
            dismissedMeetingIDs.push(meetingID);
        }
        else
        {
            for(var i:int=0; i < dismissedMeetingIDs.length; i++)
            {
                //trace("dismissedMeetingIDs[" + i + "] = " + dismissedMeetingIDs[i]);
                if(meetingID == dismissedMeetingIDs[i])
                {   //this one has already been dismissed
                    doDisplayToast = false;
                    containsMeetingID = true;
                    break;
                }
                else
                {
                    doDisplayToast = true;
                    containsMeetingID = false;
                }
            }

            if(containsMeetingID == false)
            {
                dismissedMeetingIDs.push(meetingID);
            }
        }
        return doDisplayToast;
    }

}

これが私のMXMLコンポーネント(基本クラスはGroup)のコードです。

import com.fmr.transporter.controller.TransporterController;
        import com.fmr.transporter.events.CustomEvent;
        import com.fmr.transporter.model.MeetingInfoModel;
        import com.fmr.transporter.model.TransporterModel;

        import mx.collections.ArrayCollection;
        import mx.core.FlexGlobals;
        import mx.events.CollectionEvent;
        import mx.events.FlexEvent;

        private var controller:TransporterController;

        [Bindable] public var newAttachmentsList:ArrayCollection;

        [Bindable] public var meetingInfo:MeetingInfoModel;

        private function complete():void
        {
            controller = TransporterController.getInstance();

            addListeners();
        }

        /** Add listeners to this class.
         */
        private function addListeners():void{
            MeetingInfo.getInstance().docsAndAttachmentsList.addEventListener( CollectionEvent.COLLECTION_CHANGE, updateDocsCounter );
        }
4

2 に答える 2

2

イベントクラスを拡張しました。デフォルトでは、フレックスイベントはバブルしません。CustomEventクラスコンストラクターを次のように変更する必要があります。

public function CustomEvent(type:String){
    super(type, true, true);
}

これにより、イベントがバブルになり、フレックスイベントフレームワークごとにキャンセルできるようになります。@The_asManは、バブリングしないイベントに対処する方法について正しく教えてくれましたが、誤って正しいオブジェクトを見逃した可能性があると思います。それを泡立たせてください、そして、あなたはそれを聞くでしょう!

于 2012-11-06T03:51:43.153 に答える
0

@ LondonDrugs_MediaServices、@ Flextras、および@The_asMan。

これらの人は正しいです。イベントをリッスンするために、クラスがディスプレイリストに含まれている必要はないようです。イベントをディスパッチするクラスの正しいターゲットがある限り、問題はありません。

しかし、どういうわけか、私は本当に奇妙なことをしたので、結局それを完全に理解することができませんでした。解決策は、必要なコンポーネントを更新するために、モデルで更新したコレクションにバインディングを使用することでした。

非常に有益なコメントをありがとうございました。

于 2012-11-13T15:18:29.823 に答える