イベントにリスナーがあるかどうかの判定
このイベントにリスナーが存在するか
関数 event.hasListener
を使用して、特定のイベントにリスナーがあるかどうかを判定します。event.hasListener
はイベント ソース オブジェクトの配列とイベント名を入力引数として受け入れます。この関数は、配列内の各オブジェクトの指定されたイベントに対するリスナーが存在するかどうかを示す論理値の配列を返します。
メモ
呼び出されたときに、event.hasListener
にはイベントの NotifyAccess
がなければなりません。つまり、対象のイベントに対する notify
を呼び出すことができるコンテキストで event.hasListener
を呼び出します。
リスナーをテストする理由
イベントに対するリスナーがない場合、event.hasListener
を使用してイベントの通知が送信されないようにします。たとえば、カスタム イベント データの作成によって多くのリソースが消費される場合や、イベントが繰り返しトリガーされる場合、以下の手順を実行する前に event.hasListener
を使用してリスナーをテストします。
コーディング パターン
event.hasListener
を使用して、イベント データの作成とnotify
の呼び出しに条件を付けます。オブジェクト配列a
に対して、イベント データを作成し、イベントをトリガーする前にリスナーがあるかどうかを判定します。if any(event.hasListener(a,'NameOfEvent')) evt = MyCustomEventData(...); notify(a,'NameOfEvent',evt) end
event.hasListener
によって返される値での論理インデックス付けを使用して、イベントを選択的にトリガーします。リスナーをもつ配列要素についてのみイベントの通知を送信します。ind = event.hasListeners(a,'NameOfEvent'); notify(a(ind),'NameOfEvent',evt)
異種混合配列のリスナー
入力オブジェクトの配列が異種混合の場合、配列のクラスは指定されたイベントを定義しなければなりません。配列のすべてのオブジェクトで定義されているイベントに対してのみリスナーをクエリできます。
たとえば、次の図で、クラス SpecificA
、SpecificB
、SpecificC
のオブジェクトで構成される異種混合配列のクラスは RootSuperclass
です。したがって、event.hasListener
は、RootEvent
イベントに対するリスナーのみを検出できます。すべての配列要素に共通の唯一のイベントであるためです。
非常に "Specific" なこれら 3 つのクラスを使用して異種混合配列を作成します。
het = [SpecificA,SpecificB,SpecificC]; class(het)
ans RootSuperclass
events(het)
Events for class RootSuperclass RootEvent
event.hasListener
は、配列の一部 (すべてではない) のオブジェクトによって定義されたイベントに対するリスナーがあるかどうかを判定できません。
event.hasListener(het,'ClassAEvent')
Error using event.hasListener Event 'ClassAEvent' is not defined for class 'RootSuperclass'.
配列にインデックスを付けて、異種混合配列の個々のオブジェクトに特定のイベントに対して定義されたリスナーがあるかどうかを判定します。
event.hasListener(het(1),'ClassAEvent')
異種混合配列のクラスの判定に関する詳細については、異種混合クラス階層の設計を参照してください。