题
当编写的图形用户界面,我经常来以下问题:假设你有一个模型和控制器。控制器有一个小部件 W
这是用于显示一个酒店 X
该模型。
因为该模型可能会改变从外部控制器(可能还有其他控制器,使用同样的模式,撤销行动等),控制器听上的变化模型。控制器也听事件 W
和更新酒店 X
相应。
现在,以下情况:
- 值
W
是改变 - 一个事件产生,处理程序 控制器 调用
- 的 控制器 套新的价值
X
在 模型 - 的 模型 发射事件,因为它已经改变了
- 的 控制器 收到一个改变事件 模型
- 的 控制器 得到的价值
X
并将它设置在件 - goto1.
有几种可能的解决方案:
- 修改控制器的设定一个标志的时候模型更新,并且不应对任何事件的型号,如果这个标志的设置。
- 断路器暂时(或者告诉型号不要发送的任何事件对于一些时间)
- 冻结的任何更新的部件
在过去,我通常去备选案文1., 因为这是最简单的事情。它具有的缺点弄乱你的课程的标志,但是其他的方法都有其缺点,也是。
只是为了记录在案,我们有这个问题与几个闺工具包,包括GTK+,脱及他,所以我认为这是相当的工具包-不可知论者。
任何最佳做法?或是建筑我用错误的?
@害羞:这是一个解决方案的一些情况,但是你仍然可以获得一个圆形的事件,如果是多余的 X
是改变从外部控制器(例如,当使用的指令模式撤销/恢复),因为那时的价值已经改变, W
更新和火灾事件。为了防止另一个(无)更新的模型,该事件产生的部件已经被吞噬。
在其他情况下,该模式可能更加复杂和简单的检查究竟是什么,已经改变可能不可行的,例如一个复杂的树图。
解决方案
通常你应该为输入活动的小部件,并没有改变的事件。这可以防止这种类型的循环,从发生的.
- 用户输入的变化的部件
- 部件发出的变化事件(滚动做/客点击鼠标离开,等等。)
- 控制器作出响应,意味着要改变模型
- 模型发射事件
- 控制器作出响应,更改价值的部件
- 值变化事件中发现,但不听取了通过控制器
其他提示
标准夸脱的方式处理这也和一个建议,在他们的非常有用的教程以编变化价值的控制只有当新的价值是不同的当前价值。
这是信号的语义 valueChanged()
的标志,以表明updaing的工作。你可以用它们的方法,如"BeginUpdate"和EndUpdate.
不隶属于 StackOverflow