0

他の人が始めたプロジェクトに取り組まなければならないのですが、彼は現在国外にいるため連絡が取れません。ともかく。メインの mxml と「admin」と呼ばれるカスタム コンポーネントがあります。

admin で、彼は次のようなイベントを宣言しました。

    <fx:Metadata>
    [Event(name="sluitFrame")]
</fx:Metadata>

コンポーネント内の特定の関数では、このイベントは次のように呼び出されます。

dispatchEvent(new Event("sluitFrame"));

このイベント sluitFrame は、いくつかの管理ツールでフレームを閉じます。これが機能する方法を変更する必要があるため、対応するコードを見つけたいと思います。メインの mxml には次のコードがあります。

                <comp:Admin id="compAdmin" creationPolicy="none"
                         sluitFrame="verbergAdminComponent(event)"/>

したがって、「verbergAdminComponent(event)」と呼ばれるカスタムへの sluitFrame 呼び出しを正しく理解していれば。したがって、管理フレームを閉じる方法などを変更するには、このイベントが必要だと思いますが、このイベントはどこにも見つかりません。そのため、「verbergAdminComponent(event)」がどのように機能するのか、またはこのイベントをどこで変更できるのかがわかりません。

どんな助けも大歓迎であり、非常に必要とされています:)

4

3 に答える 3

2

この[Event...行は、コンポーネント/クラス (この場合はAdmin) がその名前でイベントを送出する可能性があることをコンパイラと IDE に知らせるだけです。誰かが MXML タグで Admin のインスタンスを宣言すると、コンパイラはこのイベント (この場合はsluitFrame) が有効なプロパティであることを認識するため、これは重要です。つまり、MXML タグでイベント リスナーを設定できることをコンパイラに知らせます。Adminあなたの場合、オブジェクトがイベントをディスパッチするたびsluitFrameに、関数verbergAdminComponentが呼び出され、sluitFrame イベントがそれに渡されます。

于 2012-06-11T01:27:10.750 に答える
1

イベントの種類

Flashでinを使用する場合Event、それは文字列であるため、任意の名前付き型をディスパッチできます。したがって、リスナーがまったく同じタイプをリッスンしている限り、どのように呼び出すかは問題ではありません。それが機能する理由です。進化した魔法はありません。ただし、その場合はカスタムイベントを使用することにします。

カスタムイベントの仕組み

カスタムイベントの動作を見て、メタデータがどこから来るのかも理解してください。

package com.website.events
{
    import flash.events.Event;

    /**
     * @author ExampleUser
    */
    public class MyCustomEvent extends Event
    {
        /** 
         * 
         */
        public static const CLOSE_WINDOW:String = "MyCustomEvent.closeWindow";


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

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

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

私は(あなたの例のように)直接文字列の代わりに静的定数を使用するので、より厳密に入力されます。

actionscriptでは、このようなカスタムイベントをディスパッチします。Windowという名前のクラスを作成するとします。

package com.website.ui
{
   /**
    * @eventType com.website.events.MyCustomEvent.closeWindow
   */
   [Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]

import flash.display.Sprite;
import flash.events.MouseEvent;
import com.website.events.MyCustomEvent;

/**
 * @author ExampleUser
*/
public class Window extends Sprite
{
    public var mcCloseButton:Sprite;

    public function Window():void 
    { 
        this.mcCloseButton.addEventListener(MouseEvent.CLICK, handleCloseButtonClick);
    }

    private function handleCloseButtonClick(event:MouseEvent):void 
    { 
        this.dispatchEvent(new MyCustomEvent(MyCustomEvent.CLOSE_WINDOW));
    }

}
}

これは、メタデータを配置する必要があるクラスです。このクラスはイベントをディスパッチしています。同じイベントをディスパッチする他のクラスにも、メタデータが含まれている可能性があります。

そのため、ユーザーが閉じるボタンをクリックすると、Windowはタイプ付きのイベントをディスパッチします。CLOSE_WINDOW別のファイルでは、それを聞いて何かをします。

package com.website
{
import flash.display.Sprite;
import com.website.events.MyCustomEvent;
import com.website.ui.Window;

/**
 * @author ExampleUser
*/
public class Main extends Sprite
{
    private var _window:Window;

    public function Main():void 
    { 
        this._window:Window = new Window();
                    // a smart code-editor would give you a hint about the possible events when you typed "addEventListener" 
        this._window.addEventListener(MyCustomEvent.CLOSE_WINDOW, handleWindowClosed);
        this.addChild(this._window);
    }

    private function handleWindowClosed(event:MyCustomEvent):void 
    { 
        // do something
        this._window.visible = false;
    }
}
}

これは機能するはずです。もちろん、実際の状況では。MyCustomEventという名前になりWindowEventます。

イベントメタデータ

メタデータを使用してコンパイラーにヒントを与えることができ、現在ではスマートコードエディター(FDT、FlashDevelop、FlashBuilder、IntelliJなど)がコードを完成させることができます。これは基本的に、クラスによってディスパッチされる可能性のあるイベントの種類の説明であるため、どのリスナーを使用できるかがわかります。

メタデータが削除された場合でも、コードは機能するはずです。

イベントメタにはとがnameありtypeます。名前は、タイプの正確な値である必要があります。この例の場合、それはの値である必要があるCLOSE_WINDOWので、それはMyCustomEvent.closeWindowです。タイプは完全なパッケージのクラス名である必要があります。この例の場合は、「com.website.events.MyCustomEvent」になります。

最後に、メタデータは次のようになります。

[Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]

ところで、私はあなたのコードについていくつかのヒントがあります:

  • オランダ語ではなく、英語の関数名とパラメーターを使用することをお勧めします。
  • verbergAdminComponentハンドラーの名前としては適切ではありません。関数handleCloseWindow(event)を呼び出す、のような名前にする必要がありverbergAdminComponentます。
于 2012-06-11T08:57:33.927 に答える
1

verbergAdminComponent は、イベント ハンドラーの名前になります。これは、mxml、含まれる .as、またはその MXML の基本クラスのメソッドである必要があります。

于 2012-06-11T00:32:08.720 に答える