当前位置:  开发笔记 > 编程语言 > 正文

优雅的方法来防止MVC中的循环事件?

如何解决《优雅的方法来防止MVC中的循环事件?》经验,为你挑选了0个好方法。

问题,简而言之:

在MVC中,如何区分复选框单击(或选择框或列表框更改)与人类意义"控制器,修改模型"以及从控制器单击(或选择框或列表框更改)意味着"我"更新视图,因为模型已更改"?


这个例子:

我有一个JS应用程序(所有一个大的HTML + JS页面;它背后有一个服务器,并且AJAX正在进行,但对于该示例并不重要),其中"顶点"的概念由"边缘"连接.UI允许您在地图上添加和删除顶点,以及启用或禁用顶点对之间的边.

有两种方法可以禁用从顶点A到顶点B的边:

    单击Edge以使"Edge Details"窗口为您提供"Disable This Edge"按钮; 要么

    单击顶点A(或B)使"顶点详细信息"窗口为您提供附近顶点的清单,您可以从中取消选中顶点B(或A).

以下是它在MVC中的工作原理(但请参阅本文末尾的更新,我在其中理解了我的理解中的问题):

模型:Vertex对象列表和Edge对象列表.

查看:GMaps UI,带有标记和折线,以及复选框和按钮以及"顶点细节"和"边缘细节"DIV.

控制器:

JS功能,当复选框和按钮上的事件触发时更新模型; 和

JS函数在模型上的事件触发时更新视图.

这是具体的不雅:

    用户的顶点细节窗口侧重于顶点A,边缘细节窗口侧重于从顶点A到顶点B的边缘.

    用户在"边缘详细信息"窗口中单击"禁用此边缘".

    控制器功能1获取click事件,并在Edge模型对象上调用disable().

    Edge模型对象触发"我刚被禁用"事件.

    控制器功能2接收"我刚被禁用"事件,并且

      重新绘制边缘详细信息窗口,说"我已禁用!" 和

      在"顶点详细信息"窗口中取消选中"顶点B".

        扯淡!这再次触发Controller函数1,它正在侦听意味着边缘被禁用的UI事件!

因此,不必要的重新更新模型,并重新更新View.在一个更复杂的视图中,事件会触发触发事件的事件,这可能会导致数十个无关的更新!


更新:一个很好的答案.

我误解了MVC.我没有一个View,如上所述:我有几个模型的几个视图.特别是,我有一个特定节点的复选框列表边缘视图,以及一个独立的"详细窗口式"边缘视图.

此外,我不应该在模型更改时更新所有视图的一个控制器功能:每个视图应在模型更改时自行修改.

因此,如果每个View在Model上注册"状态更新"事件,并且每个View在收到这些事件后自行更新,那么我的循环事件问题的答案就是:

复选框列表视图将禁用复选框事件,以便在模型状态更改后更新复选框.

现在,如果用户通过"边缘详细信息"窗口禁用边缘,则控制器会更新边缘模型,复选框列表视图会收到更新通知,复选框列表视图足够智能,可以在更改状态时隐藏复选框事件.适当的复选框

这比我原来的解决方案更加可口,其中一个Controller更新所有视图 - 因此必须知道哪些视图需要特别小心和提供以避免循环.相反,只有具有麻烦的UI元素的单个View必须处理该问题.

感谢那些回答我问题的人!

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有