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

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

Используйте 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')

Для получения дополнительной информации об определении класса разнородных массивов см. Раздел «Разработка гетерогенных иерархий классов».

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте