Main Content

イベントにリスナーがあるかどうかの判定

このイベントにリスナーが存在するか

関数 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)

異種混合配列のリスナー

入力オブジェクトの配列が異種混合の場合、配列のクラスは指定されたイベントを定義しなければなりません。配列のすべてのオブジェクトで定義されているイベントに対してのみリスナーをクエリできます。

たとえば、次の図で、クラス SpecificASpecificBSpecificC のオブジェクトで構成される異種混合配列のクラスは RootSuperclass です。したがって、event.hasListener は、RootEvent イベントに対するリスナーのみを検出できます。すべての配列要素に共通の唯一のイベントであるためです。

Heterogeneous array with class events

非常に "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')

異種混合配列のクラスの判定に関する詳細については、異種混合クラス階層の設計を参照してください。

関連するトピック