在我的MVC应用程序中,我使用Swing显示图表。它由具有不同设置的多个面板控制。我有MainModel
来构建DomainObject
ChartView
个MainModel
输出。由于有多个面板而且我不想让ChildModels
变大,因此会为每个面板创建MainController
并拥有自己的视图。反过来,ChildControllers
会将MainModel
附加到他们身上。 'ChartView'注册自己以观察ChildModels
中的更改以更新输出。
第一个问题是,由于MainModel
基本上是ChartView
的一部分,因此他们的更改必须触发MainModel
上的更新(除了他们自己的观点)。为了解决这个问题,我必须让ChartView
手动注册ChartView
子项。所以,现在我有多个模型附加到MainModel
。虽然我知道这可能是由于糟糕的设计(创建子模型的模型等)引起的,但解决方案仍然正常。但我想听听打破一个大模型的其他方法。我有一个想法让ChildModels
听取ChartView
中的更改并通知ChartView
。这样,只有一个模型与ChartView
进行通信。
第二个问题是first panel
更新的链触发。之所以发生这种情况,是因为所有这些具有设置的面板都有一些相互依赖的值因此,如果用户在second panel
中输入了某个值,则second panel
中的值可以更改的范围。当控制器更新StateChange Event
时,它会触发ChartView
。由于ChildModels
被用于收听ChartView
上的更新,因此它将从两个小组收到更新通知。现在,在我的情况下,我有8个。这使得来自用户的单个输入导致8 GraphView
重绘。这可能是设计不良的结果。但在这种情况下,我不知道如何正确处理这些多个更新通知,并使beginUpdate
仅在上次请求时更新。我的解决方案是进行交易更新。模型发送endUpdate
和endUpdate
通知,而不是单个通知来查看。只有在视图收到{{1}}后,它才会查询模型以获取更新的数据。这种嵌套模型更新通知有点“静音”。
我想知道你是如何处理这些问题的。感谢
答案 0 :(得分:0)
根据我对您的疑虑的理解,错误是让ChartView
同时听取几个模型。 MVC假设只有一个模型。因此ChartView
应将仅连接到MainModel
。 MainModel
的目标是正确地复用来自面板的更改,并将事件分派给ChartView
。您想让MainModel
听取子模型并提供ChartView
的想法对我来说就像是正确的设计。
关于第二个问题,常见用法包括事件中的布尔参数(例如multiple
)。值true
表示下一个事件是序列的一部分,false
表示序列结束。如果事件不是序列的一部分,请将参数设置为false
(这意味着序列长度为1)。在您的使用案例中,只需忽略true
的事件并等待false
个事件来查询稳定状态。