触发和收听事件

时间:2019-06-18 17:10:06

标签: matlab events

我有一个表示某些数据的类,以及一个从这些数据中得出的(简短)结果链。该类具有三个属性Data1Data2Data3,其中Data2取决于Data1(实际上是它的过滤版本)和{{ 1}}取决于Data3

我的想法是在Data2发生变化时触发一个事件,计算出Data1,然后触发另一个事件,导致计算出Data2。但是,在下面的测试类中,Data3在构造后为空。

请注意,我使用的是Widget toolbox中的Data3

uiw.event.EventData

如果有人对此进行调试,就会发现从未将classdef test < handle events DataChanged end properties DataChangedListener event.listener end properties (AbortSet) Data1 (:,:) double = [] Data2 (:,:) double = [] Data3 (:,:) double = [] end methods function self = test() self.DataChangedListener = event.listener(self, 'DataChanged', @self.onDataChanged); self.Data1 = peaks(64); end %% setter function set.Data1(self, d) self.Data1 = d; evt = uiw.event.EventData( ... 'EventType', 'DataChanged', ... 'Property', 'Data1', ... 'Model', self ); self.notify('DataChanged', evt); end function set.Data2(self, d) self.Data2 = d; evt = uiw.event.EventData( ... 'EventType', 'DataChanged', ... 'Property', 'Data2', ... 'Model', self ); self.notify('DataChanged', evt); end function set.Data3(self, d) self.Data3 = d; evt = uiw.event.EventData( ... 'EventType', 'DataChanged', ... 'Property', 'Data3', ... 'Model', self ); self.notify('DataChanged', evt); end %% Event callback function onDataChanged(self, ~, evt) switch evt.Property case 'Data1' self.Data2 = self.Data1 + 5; case 'Data2' self.Data3 = self.Data2 + 10; end end end end onDataChanged一起调用uiw.event.eventData

有人知道为什么以及如何正确触发事件吗?

1 个答案:

答案 0 :(得分:1)

我想我解决了这个难题。

您的代码以递归方式执行侦听器回调。 默认情况下禁用递归侦听器。

请参阅Event and Listener Concepts

  

Recursive(递归)—允许侦听器触发导致执行回调的相同事件。   默认情况下,递归为false。如果回调触发了将其定义为回调的事件,则侦听器无法递归执行。因此,如果回调必须触发自己的事件,则将Recursive设置为false。将Recursive属性设置为true可能会导致无限递归达到递归限制并触发错误的情况。

您需要做的就是将Recursive属性设置为true

self.DataChangedListener = event.listener(self, 'DataChanged', @self.onDataChanged);

之后

添加:self.DataChangedListener.Recursive = true;