Определение того, есть ли у события получатели

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

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

Примечание

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

Почему тест для прослушивателей

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

Кодирование шаблонов

  • Conditionalize создание данных о событиях и вызова 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')

Для получения дополнительной информации об определении класса разнородных массивов, смотрите Разрабатывающие Неоднородные Иерархии классов.

Похожие темы