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

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

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

  • Задайте атрибуты свойства SetObservable и/или GetObservable.

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

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

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

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

Установка Атрибутов свойств включать События свойства

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

properties (SetObservable) 
   PropOne
   PropTwo
   ...
end

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

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

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

  • Данные о событиях — объект 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

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

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

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

Метод класса Handle handle.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 задает два прослушивателя:

  • Событие Property PropOne PostSet

  • Событие Property 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

Похожие темы