exponenta event banner

Прослушивание изменений значений свойств

Создание прослушивателей свойств

Для классов дескрипторов можно определить прослушиватели для предварительно объявленных событий свойств (имя: PreSet, PostSet, PreGet, и PostGet). Чтобы создать прослушиватели для именованных событий, выполните следующие действия.

  • Укажите SetObservable и/или GetObservable атрибуты свойства.

  • Определение функций обратного вызова

  • Создайте прослушиватель свойств, включив имя свойства и событие в вызов addlistener или listener.

  • При необходимости подкласс event.data создание специализированного объекта данных события для передачи функции обратного вызова.

  • Запретить выполнение обратного вызова, если новое значение совпадает с текущим (см. раздел Назначение при неизменном значении свойства).

Задать атрибуты свойств для включения событий свойств

В блоке свойств включите SetObservable атрибут. Можно определить PreSet и PostSet прослушиватели свойств, определенных в этом блоке:

properties (SetObservable) 
   PropOne
   PropTwo
   ...
end

Определение функции обратного вызова для события свойства

Прослушиватель выполняет функцию обратного вызова, когда MATLAB ® запускает событие свойства. Определите функцию обратного вызова, чтобы иметь два конкретных аргумента, которые передаются функции автоматически при вызове прослушивателем:

  • Источник события - a meta.property объект, описывающий объект, являющийся источником события свойства

  • Данные о событии - a event.PropertyEvent объект, содержащий информацию о событии

При необходимости можно передать дополнительные аргументы. Этот метод часто просто определить как Static поскольку эти два аргумента содержат наиболее необходимую информацию в свойствах.

Например, предположим, что handlePropEvents функция - статический метод класса, создающий прослушиватели для двух свойств объекта другого класса:

methods (Static)
   function handlePropEvents(src,evnt)
      switch src.Name 
         case 'PropOne'
         % PropOne has triggered an event
            ...
         case 'PropTwo'
         % PropTwo has triggered an event
            ...
      end
   end
end

Другая возможность - использовать event.PropertyEvent объект EventName свойство в switch оператор для отключения имени события (PreSet или PostSet в данном случае).

Метаданные класса предоставляют дополнительные сведения о meta.property класс.

Добавить прослушиватель в свойство

addlistenerметод класса дескриптора позволяет присоединить прослушиватель к свойству без сохранения объекта прослушивателя в качестве постоянной переменной. Для события свойства используйте версию с четырьмя аргументами addlistener.

Вот звонок на addlistener:

addlistener(EventObject,'PropOne','PostSet',@ClassName.handlePropertyEvents);

Аргументы следующие:

  • EventObject - дескриптор объекта, генерирующего событие

  • PropOne - имя свойства, к которому требуется прослушать

  • PostSet - название события, для которого требуется прослушать

  • @ClassName.handlePropertyEvents - дескриптор функции, ссылающийся на статический метод, который требует использования имени класса

Если обратный вызов прослушивателя является обычным методом, а не статическим, используется следующий синтаксис:

addlistener(EventObject,'PropOne','PostSet',@obj.handlePropertyEvents);

где obj является дескриптором объекта, определяющего метод обратного вызова.

Если обратный вызов прослушивателя является функцией, которая не является классовым методом, в эту функцию передается дескриптор функции. Предположим, что функция обратного вызова является пакетной функцией:

addlistener(EventObject,'PropOne','PostSet',@package.handlePropertyEvents);

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

Классы событий и прослушивателей свойств

В следующих двух классах показано, как создавать PostSet прослушиватели свойств для двух свойств - PropOne и PropTwo.

Класс, генерирующий событие

PropEvent класс включает свойство PreSet и PostSet инициирование события путем указания SetObservable атрибут свойства. Эти свойства также позволяют AbortSet атрибут, который предотвращает инициирование событий свойства, если свойства имеют значение, совпадающее с текущим значением (см. раздел Назначение при неизменном значении свойства).

classdef PropEvent < handle
   properties (SetObservable, AbortSet)
      PropOne
      PropTwo
   end
   methods
      function obj = PropEvent(p1,p2)
         if nargin > 0
            obj.PropOne = p1;
            obj.PropTwo = p2;
         end
      end
   end
end

Класс, определяющий прослушиватели

PropListener класс определяет два прослушивателя:

  • Собственность PropOne PostSet событие

  • Собственность PropTwo PostSet событие

С помощью аналогичного подхода можно определить прослушиватели для других событий или других свойств. Нет необходимости использовать одну и ту же функцию обратного вызова для каждого прослушивателя. См. раздел meta.property и event.PropertyEvent справочные страницы для получения дополнительной информации, содержащейся в аргументах, переданных функции обратного вызова прослушивателя.

classdef PropListener < handle
   % Define property listeners
   methods
      function obj = PropListener(evtobj)
         if nargin > 0
            addlistener(evtobj,'PropOne','PostSet',@PropListener.handlePropEvents);
            addlistener(evtobj,'PropTwo','PostSet',@PropListener.handlePropEvents);
         end
      end
   end
   methods (Static)
      function handlePropEvents(src,evnt)
         switch src.Name
            case 'PropOne'
               sprintf('PropOne is %s\n',num2str(evnt.AffectedObject.PropOne))
            case 'PropTwo'
               sprintf('PropTwo is %s\n',num2str(evnt.AffectedObject.PropTwo))
         end
      end
   end
end

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