多个属性监听器等待两者触发回调

Posted

技术标签:

【中文标题】多个属性监听器等待两者触发回调【英文标题】:Multiple property listeners wait for both to trigger callback 【发布时间】:2015-10-07 01:38:15 【问题描述】:

我在 Matlab 中遇到了一些关于属性监听器的问题。我为轴的XLimYLim 属性添加了一个侦听器,在PostSet 上触发:

h = addlistener(myaxes,'XLim','YLim','PostSet',@myfunc);

现在我希望我的程序在两个属性都改变后做一些事情,或者如果只有一个改变了,但在后一种情况下,我必须确保另一个没有改变。

在坐标区上使用缩放工具时,属性总是会同时发生变化,并且总是按照x,然后是y 的顺序发生变化。所以在这种情况下我不会有问题,但有时我以编程方式设置XLimYLim 属性并希望触发相同的功能。不知何故,我必须能够判断这两个属性中是否只有一个触发了侦听器,或者两者都触发了。

在当前阶段,我的回调执行了两次:一次用于XLim,一次用于YLim。我希望它只执行一次,并且恰好在我知道这两个属性没有进一步变化之后。你知道怎么做吗?

【问题讨论】:

【参考方案1】:

我不相信可以直接检测到“同时”的set,因为实际的属性分配,而不仅仅是PostSet事件,是单独执行的,没有额外的信息传递给@ 987654323@ 回调,让您知道另一个即将到来。在第一个回调中的断点处停止,轴完全更新为新的XLim,没有任何迹象表明即将更改为YLim

根据您对代码使用方式的假设以及您的优先事项,有很多方法可以组合出解决方法。我能想到的都至少使用以下原则之一:

在某个阶段使用计时器允许可能的YLim 分配在完成XLim PostSet 回调的工作之前触发第二个回调 为不带YLimXLim 分配创建一个自定义例程,以在某种程度上与缩放工具等工具进行的分配区分开来 利用缩放工具首先设置XLimMode 属性的事实,无论其值是否发生变化。如果XLimMode 的值已经是manual,则以编程方式设置XLim 将不会设置XLimMode

【讨论】:

以上是关于多个属性监听器等待两者触发回调的主要内容,如果未能解决你的问题,请参考以下文章

vue3的监听函数watch基础

vue--监听器

vue实现原理

等待侦听器完成

watch监听(数组或者对象)

vue之watch和计算属性computed