Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 触发和监听事件_Matlab_Events - Fatal编程技术网

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