exponenta event banner

Определить, есть ли у события прослушиватели

Существуют ли прослушиватели для этого события?

Используйте event.hasListener для определения наличия прослушивателей в конкретном событии. event.hasListener принимает массив объектов источника события и имя события в качестве входных аргументов. Он возвращает массив логических значений, указывающих, существуют ли прослушиватели для указанного события для каждого объекта в массиве.

Примечание

При вызове, event.hasListener должен иметь NotifyAccess для мероприятия. То есть звонить event.hasListener в контексте, в котором можно вызвать notify для рассматриваемого события.

Зачем тестировать слушателей

Использовать event.hasListener чтобы избежать отправки уведомлений о событиях, когда нет прослушивателей для события. Например, если создание пользовательских данных событий требует значительных ресурсов или события запускаются повторно, используйте event.hasListener для проверки прослушивателей перед выполнением этих шагов.

Шаблоны кодирования

  • Создание условий для создания данных о событиях и вызова notify использование event.hasListener. Для массива объектов 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 событие, поскольку оно является единственным событием, общим для всех элементов массива.

Создайте гетерогенный массив с тремя наиболее конкретными классами:

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')

Дополнительные сведения об определении класса гетерогенных массивов см. в разделе Проектирование иерархий гетерогенных классов.

Связанные темы