3

あるフレックスモジュールから別のフレックスモジュールにカスタムイベントをディスパッチしようとしています。

イベントをディスパッチするコードは以下のとおりです

Application.application.Destination.child.dispatchEvent(
    new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));

ここでAlgoEventはカスタムイベントです

反対側では、イベントをキャッチして処理するモジュールに次のコードがあります。

public  function sendParametersToChild(e:AlgoEvent):void
{
    //some codes
}

ただし、ステートメントApplication.application.Destination.child.dispatchEvent(new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));が実行されると、デバッガーは次の実行時例外を発生させます。

TypeError: Error #1034: Type Coercion failed: cannot convert resources.events::AlgoEvent@4182239 to resources.events.AlgoEvent.
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
    at components::Destination/sendTimeToChild()[E:\FlexProjects\MyApp\src\components\Destination.mxml:99]
    at components::Destination/updateParameters()[E:\FlexProjects\MyApp\src\components\Destination.mxml:206]
    at components::Destination/__CreateBasketButton_click()[E:\FlexProjects\MyApp\src\components\Destination.mxml:558]

ここで何が問題になっているのか特定できません。この問題の解決にご協力ください

これは私のイベントクラスです

public class AlgoEvent extends Event
{
    public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";
    private var eventType:String;

    public function AlgoEvent(eventType:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(eventType,bubbles,cancelable);
        this.eventType=eventType;
    }
}

デバッグ中に、UIComponentクラスのこの機能でエラーが発生します

override public function dispatchEvent(event:Event):Boolean
{
    if (dispatchEventHook != null)
        dispatchEventHook(event, this);

    return super.dispatchEvent(event); 
}

まさにこの行はエラーを出します:dispatchEventHook(event, this);

4

7 に答える 7

3

AlgoEventメインアプリケーションにクラスをインポートし、そのクラスへの参照を作成します

import resources.events.AlgoEvent;
private var dummyEvent: AlgoEvent;

これに関するいくつかの説明はここで見つけることができます:モジュールドメイン

カスタムイベントに特別なイベントプロパティが含まれていない場合は、標準Eventクラスを使用して問題を回避できます。

dispatchEvent(new Event(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
于 2011-03-23T07:35:23.873 に答える
2

ディスパッチ時に同じ問題が発生し、2つの関数のオーバーライドを解決しました。

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

override public function toString():String
{
        return formatToString("AlgoEvent","type"","bubbles","cancelable","eventPhase");
}

お役に立てば幸いです:)

于 2011-05-14T03:50:29.500 に答える
1

スプラッシュ氏は私からうまくいった解決策を提案しました:

Custum Event(私の場合はAlgo Event)クラスをメインアプリケーションに認識させるようにしてください。

つまり、メインアプリケーションにインポートし、その変数を作成します。

そして、それは主な理由で機能します>>イベントディスパッチを使用してモジュール間で通信しようとすると、モジュールは実行時にロードされますが、イベントクラスなどのクラスは実行時にモジュールにリンクされます。イベントクラスは、モジュールがロードされる前にコンパイルされます。

アプリケーションはコンパイル時にCustumイベントクラスを定義し、モジュールは公開時に独自のCustumイベントクラスを定義します。次に、アプリケーションを実行すると、アプリケーションでディスパッチされたCustumイベントクラスがモジュールswfのクラスと一致しません。

このエラーの原因となっている問題については、次のリンクを確認できます。

http://www.kirupa.com/forum/showthread.php?t=320390

そしてまた

http://www.jeffdepascale.com/index.php/flash/custom-events-in-loaded-swf-files/

于 2011-03-23T10:41:21.140 に答える
0

Mateフレームワークがこれらすべてを処理します。アプリ内のすべてのモジュールに対して、グローバルイベントバスを提供します。 http://mate.asfusion.com/

于 2011-03-23T06:20:33.760 に答える
0

カスタマイズしたEvent、AlgoEventのclone()メソッドをオーバーライドしてみてください。次のコードをAlgoEvent.asクラスに追加して、試してください。

public function clone():Event {return new AlgoEvent(eventType、bubbles、cancelable);をオーバーライドします。}HTH。

于 2011-03-23T08:31:23.450 に答える
0

カスタムイベントクラスは次のようになります。

public class AlgoEvent extends Event
{
    public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";

    public function AlgoEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    };

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

新しいプロパティを作成する代わりに、イベントの継承されたタイププロパティを使用する必要があります。

また、にUIComponentは独自のdispatchEventメソッドがあるため、独自のメソッドを作成する必要はありません。継承されたメソッドとは動作が異なる場合に限ります。

よろしく、ロブ

于 2011-03-23T10:29:16.377 に答える
-1

さて、建築の観点から、あなたがしていることは間違っていると言わなければなりません。Application.applicationを呼び出すことは、特に表示ツリーを下に移動し始めている場合は特に、非常に多くの理由で不適切です。2番目の子のいずれかが変更されると、ビルドが壊れます。これはモジュールであるため、実行時までわかりません。

必要なのはアプリケーションフレームワークです。保守性を低下させることなく複雑さを増す方法。そこにはたくさんありますが、私の個人的なお気に入りはパセリです。私はそれを多くの非常に大規模なプロジェクトで使用し、多くの成功を収めてきました。現在解決しようとしている問題、つまり、他のモジュールがリッスンする1つのイベントをディスパッチすることは、非常に簡単です(約3行のコードで実行できます)。

パセリの紹介に関する私のプレゼンテーションと同様に、それを確認することをお勧めします。

于 2011-03-23T18:12:58.593 に答える