Matlab 触发和监听事件
我有一个类,它表示一些数据和一个(短)源于这些数据的结果链。该类有三个属性Matlab 触发和监听事件,matlab,events,Matlab,Events,我有一个类,它表示一些数据和一个(短)源于这些数据的结果链。该类有三个属性Data1、Data2和Data3,其中Data2依赖于Data1(它实际上是它的过滤版本),而Data3依赖于Data2 我的想法是在Data1发生变化时触发一个事件,计算Data2,然后触发另一个事件,导致计算Data3。但是,在下面的测试类中,Data3在构造后为空 请注意,我使用来自的uiw.event.EventData classdef测试
Data1
、Data2
和Data3
,其中Data2
依赖于Data1
(它实际上是它的过滤版本),而Data3
依赖于Data2
我的想法是在Data1
发生变化时触发一个事件,计算Data2
,然后触发另一个事件,导致计算Data3
。但是,在下面的测试类中,Data3
在构造后为空
请注意,我使用来自的uiw.event.EventData
classdef测试
如果对此进行调试,您会发现onDataChanged
从未使用uiw.event.eventData
调用evt.Property='Data2'
有人知道为什么以及如何正确触发事件吗 我想我解决了这个难题 您的代码递归执行侦听器回调。
默认情况下,已禁用递归侦听器 参考: 递归-允许侦听器触发导致回调执行的同一事件。 递归默认为false。如果回调触发了它定义为回调的事件,则侦听器不能递归执行。因此,如果回调必须触发自己的事件,请将Recursive设置为false。将Recursive属性设置为true会造成无限递归达到递归限制并触发错误的情况 您只需将
Recursive
属性设置为true
:
在self.DataChangedListener=event.listener(self,'DataChanged',@self.onDataChanged)之后代码>
添加:
self.DataChangedListener.Recursive=true代码>太棒了!但是文档在这里有一个错误,不是吗:因此,如果回调必须触发自己的事件,请将Recursive设置为false。“false”应该是“true”,不是吗?我认为文档描述了必须防止无限递归的情况。
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