Слушайте изменения значений свойств

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

Для классов handle можно задать прослушиватели для предшествующих событий свойства (с именем: 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 класс.

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

The addlistenerКласс Handle метод позволяет вам присоединить слушатель к свойству, не сохраняя объект слушателя как постоянную переменную. Для события свойства используйте версию с четырьмя аргументами 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.

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

The 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

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

The 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

Похожие темы