1

Button クラスを拡張し、次の方法でデフォルトの EventListener を削除しようとしています。

removeEventListener(MouseEvent.CLICK, clickHandler);

そして、次のようなものを追加します。

    protected function _clickHandler(event:MouseEvent):void{
        Alert.show("Are you sure about this operation", "Alert", 3, this, execute);
        function execute(e:CloseEvent):void{
            if(e.detail == Alert.YES)
                super.clickHandler(event);
        }
    } 

このようにして、YES または NO オプションでメッセージ アラートをトリガーするデフォルト コンポーネントを用意し、サーバーをトリガーするすべてのボタンにそれを記述する必要がないようにします。残念ながら、そのようには機能しません。

  1. デフォルトの関数を削除して、リスナーに書いた関数を追加しようとしました。
  2. clickHandler を直接オーバーライドしようとしましたが、うまくいきません。

編集:これが私が望むものです:ユーザーがアプリケーションでサービス呼び出しを行うボタンをクリックすると、私は常にウィンドウをポップして、彼がそれを確信しているかどうかを教えてくれます。私が欲しかったのは、次のような自動コンポーネントを構築することでした:

package screen{
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

import mx.controls.Alert;
import mx.controls.Button;
import mx.events.CloseEvent;

public class CommonButton extends Button{
    public function CommonButton(){
        super();
        //removeEventListener(MouseEvent.CLICK, clickHandler)
        //addEventListener(MouseEvent.CLICK, clickHandler);
        addEventListener(KeyboardEvent.KEY_DOWN, function (e:KeyboardEvent):void{
            if(e.altKey == Keyboard.ENTER)
                dispatchEvent(new MouseEvent(MouseEvent.CLICK));
        });
    }

    private var _saveEvent:MouseEvent;
    override protected function clickHandler(event:MouseEvent):void{
        _saveEvent = event;
        event.stopImmediatePropagation();
        Alert.show("Are you sure about this operation", "Alert", 3, this, execute);         
    } 

    private function execute(e:CloseEvent):void{
        if(e.detail == Alert.YES)
            super.clickHandler(_saveEvent);
    }
}
}

その後:

    <mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        private function test():void{
            //if the user clicked No, this method will never be called.
            Alert.show("You clicked YES");
        }
    ]]>
</mx:Script>
<screen:CommonButton click="test()" /> 

ソリューションを使用した最終編集:

package screen{
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

import mx.controls.Alert;
import mx.controls.Button;
import mx.events.CloseEvent;

public class CommonButton extends Button{
    public function CommonButton(){
        super();
        addEventListener(KeyboardEvent.KEY_DOWN, function (e:KeyboardEvent):void{
            if(e.altKey == Keyboard.ENTER)
                dispatchEvent(new MouseEvent(MouseEvent.CLICK));
        });
    }

    private var _stopProp:Boolean = true;
    override protected function clickHandler(event:MouseEvent):void{
        if(_stopProp){
            event.stopImmediatePropagation()
            Alert.show("Are you sure about this operation", "Alert", 3, this, execute);
        }else
            _stopProp = true;

    } 

    private function execute(e:CloseEvent):void{
        if(e.detail == Alert.YES){
            _stopProp = false;
            dispatchEvent(new MouseEvent(MouseEvent.CLICK));
        }
    }
}

}

4

2 に答える 2

2

なぜこれを気にするのですか?カスタム イベント ハンドラーを拡張コンポーネントに追加するだけで、通常のイベント ハンドラーが問題なく起動できるようになります。同じイベントに複数のハンドラーを登録できます。これが問題であることがわかった唯一の理由は、これをライブラリとしてリリースしていて、ユーザーが自分でクリック ハンドラーをアタッチできないようにしたい場合ですが、そうではありません。ここでは、デフォルトのクリック ハンドラーを削除または停止する必要はまったくありません。

編集:これは、質問者がここで起こりたいことの例です。

public class AButton extends Button
{
    private var stopProp:Boolean = true;

    public function AButton()
    {
        super();
        this.addEventListener(MouseEvent.CLICK,this.clickHandlers);
    }

    private function clickHandlers( e:MouseEvent ):void{
        if ( stopProp ) {
            e.stopImmediatePropagation();

            trace( "clicked in button" );
            Alert.show( "Continue with event", "Warning!", Alert.YES|Alert.NO, null, this.closeHandler  );
        }
    }

    private function closeHandler( e:CloseEvent ):void {
        if ( e.detail == Alert.YES ) {
            this.stopProp = false;
            this.dispatchEvent( new MouseEvent( MouseEvent.CLICK ) );
            this.stopProp = true;
        }
    }
}

stopPropプロパティが trueの場合、これ以上イベントが進行しなくなります。次に、ユーザーにプロンプ​​トを表示します。ユーザーが「はい」を選択すると、stopProp が false に設定され、ボタンからクリック イベントが再ディスパッチされ、次回のために stopProp が false にリセットされます。「いいえ」を選択すると、何も起こりません。

これをテストするために簡単なプロトタイプを作成しましたが、確実に機能しました。

于 2013-01-25T16:05:12.830 に答える
0

Event クラスの stopImmediatePropagation() メソッドを使用します。

protected function _clickHandler(event:MouseEvent):void{
    event.stopImmediatePropagation();

    Alert.show("Are you sure about this operation", "Alert", 3, this, execute);
    function execute(e:CloseEvent):void{
        if(e.detail == Alert.YES)
            super.clickHandler(event);
    }
}
于 2013-01-25T14:28:37.367 に答える