我有一个表示某些数据的类,以及一个从这些数据中得出的(简短)结果链。该类具有三个属性Data1
,Data2
和Data3
,其中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
。
有人知道为什么以及如何正确触发事件吗?
答案 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;