イベントハンドラである機能がわからないときにremoveEventListener
に電話する方法はありますか?Flex:removeEventListenerは安全ですか?
答えて
EventDispatcherの独自の実装を作成する必要があります。悲しいですが、ネイティブのIEventListenerプロトタイプはたくさんの便利なメソッドを提供していません。あなたがあなたのケースであなたは一度だけ使用すると、使用できるよりもイベントを発生する必要があることを述べたようにそれ以外の場合は
package {
import flash.events.EventDispatcher;
import flash.utils.Dictionary;
/**
* Advanced Event Dispatcher with a ability to remove all listener by event type
* @author Rytis Alekna
*/
public class AdvancedEventDispatcher extends EventDispatcher {
/** This var holds all references to listeners */
protected var eventListenersByType : Dictionary = new Dictionary(true);
/**
* Call this method to remove all listeners of specified type
*/
public function removeEventListenersByEventType (type : String, useCapture : Boolean = false) : void {
var key : String = type + ":" + useCapture;
if (this.eventListenersByType[ key ] && this.eventListenersByType[ key ].lenght > 0) {
// copy array of event listeners
var listenersToRemove : Array = this.eventListenersByType[ key ].concat();
// and clear original
this.eventListenersByType[ key ] = [];
// loop over all listeners
for (var i : int = 0; i < listenersToRemove.length; i++) {
this.removeEventListener(type, (removeEventListenersByEventType[i] as Function), useCapture);
}
}
}
/**
* Override this method to implement listeners registration by type.
*/
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void {
// register with native method
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
// create a key for storage
var key : String = type + ":" + useCapture;
// check if it doesn't already exist
if (!this.eventListenersByType[ key ]) {
this.eventListenersByType[ key ] = [];
}
// push listener to our storage
this.eventListenersByType[ key ].push(listener);
}
}
}
:
その実装は次のようになりますかのサンプルコードがありますAS3の信号のような便利なフレームワーク(http://johnlindquist.com/2010/01/21/as3-signals-tutorial/)
私はこの '上記の行から!(!this.eventListenersByType [key]) 'を実行すると、あなたは名目上のオブジェクトの「新しいインスタンス」を作成しています。したがって、すでに辞書に入っている可能性はありません。同じ 'type'と' useCapture'で2回呼び出したとしても、そのたびに新しい配列が作成されます。このタイプの関数では、私は別の方法をお勧めしますが、実際にこのようにしている場合は、辞書の "for"ループが必要で、一致するプロパティを持つキーを見つけてそのキーの値に押し込む必要があります。 – WORMSS
@WORMSSありがとうございます。私はオブジェクトがそれほど原始的ではなく、参照によって渡されていることを忘れていました。この例では、引数を "someEventType:false"のような文字列にシリアル化してキーとして使用するのが最善の方法です。 –
良いコール、私はそのアプローチを考えたことはありません。私は強く入力したものがあまりにも好きです。 :D – WORMSS
私があなたのことをよく理解していれば、他のすべてのイベントハンドラを削除して追加したいと思うでしょう。それは不可能です、AFAIK。あなたの目標はイベントリスナーを1つしか持たないからです。私はきれいにするよりも予防する方がいいでしょう。
preventDefault
,stopPropagation
必要なログ(イベントの代わりにコールバックを持つものなど)を使用して、関数またはカスタムクラスを使用することを検討してください。
このイベントをスパム送信する機能があります。毎分千分の一に似ています。これはオプションではありません。 –
次に、匿名関数を使用しないでください。ほとんどの場合、メモリリークが発生します。現在のプロジェクトで – moropus
- 異種機能を使用するよりも別の方法を見つけることはできません...実際には全く同じではなく、お互いに交換しています...:| | –
はこれを試してみてください:
obj.addEventListener(MouseEvent.CLICK, function(event :Event):void
{
obj.removeEventListener(MouseEvent.CLICK, arguments.callee);
});
- 1. ブーストメッセージキューのスレッドは安全でプロセスは安全ですか?
- 2. 安全で安全なセッション名とは何ですか?
- 3. "User.Identity.Name"は安全ですか?
- 4. PhoneGapは安全ですか?
- 5. req.refererは安全ですか?
- 6. Context.MODE_PRIVATEは安全ですか?
- 7. フォームは安全ですか?
- 8. SecureStringは安全ですか?
- 9. window.screenは安全ですか?
- 10. signed_requestは安全ですか?
- 11. Locale.setDefault()は安全ですか?
- 12. HttpUtility.HtmlEncodeは安全ですか?
- 13. JDBCは安全ですか?
- 14. NetworkStreamは安全ですか?
- 15. StrToInt()は安全ですか?
- 16. カピストラーノは安全ですか?
- 17. Reduxは安全ですか?
- 18. pthread_cond_waitは完全に安全ですか?
- 19. セッションを安全にカウントする方法:Session_Start/End in Global.Asaxは安全で安全ですか?
- 20. SAS Google Map Generator、安全なデータで安全ですか?
- 21. 990pxはウェブページの完全な安全な幅ですか、または980px以下で安全ですか?
- 22. Python:PyPi public modules:安全で安全かどうかを判断する方法は?
- 23. macOsフォントはウェブで安全ですか?
- 24. はOrderByRaw()で安全ですか?
- 25. Gun.jsはクライアント上で「安全」ですか?
- 26. JavaScriptでparseFloatは安全ですか?
- 27. PHP preg_functionsはマルチバイトで安全ですか?
- 28. ConcurrentDictionaryでAddOrUpdateスレッドは安全ですか?
- 29. Axapta.ExecuteStmt - 安全ですか?
- 30. オープンで安全なTCPチャネルはどのくらい安全ですか?
私はあなたに何を求めていますか?そのような機能は何のために必要ですか?ユースケースは何ですか? – moropus
私は一度に1つの偶数ハンドラを使用する必要があります。 –