问题,简而言之:
在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必须处理该问题.
感谢那些回答我问题的人!