Mic*_*ach 7 javascript model-view-controller design-patterns event-handling
问题,简而言之:
在MVC中,如何区分复选框单击(或选择框或列表框更改)与人类意义"控制器,修改模型"以及从控制器单击(或选择框或列表框更改)意味着"我"更新视图,因为模型已更改"?
这个例子:
我有一个JS应用程序(所有一个大的HTML + JS页面;它背后有一个服务器,并且AJAX正在进行,但对于该示例并不重要),其中"顶点"的概念由"边缘"连接.UI允许您在地图上添加和删除顶点,以及启用或禁用顶点对之间的边.
有两种方法可以禁用从顶点A到顶点B的边:
以下是它在MVC中的工作原理(但请参阅本文末尾的更新,我在其中理解了我的理解中的问题):
这是具体的不雅:
因此,不必要的重新更新模型,并重新更新View.在一个更复杂的视图中,事件会触发触发事件的事件,这可能会导致数十个无关的更新!
我误解了MVC.我没有一个View,如上所述:我有几个模型的几个视图.特别是,我有一个特定节点的复选框列表边缘视图,以及一个独立的"详细窗口式"边缘视图.
此外,我不应该在模型更改时更新所有视图的一个控制器功能:每个视图应在模型更改时自行修改.
因此,如果每个View在Model上注册"状态更新"事件,并且每个View在收到这些事件后自行更新,那么我的循环事件问题的答案就是:
复选框列表视图将禁用复选框事件,以便在模型状态更改后更新复选框.
现在,如果用户通过"边缘详细信息"窗口禁用边缘,则控制器会更新边缘模型,复选框列表视图会收到更新通知,复选框列表视图足够智能,可以在更改状态时隐藏复选框事件.适当的复选框
这比我原来的解决方案更加可口,其中一个Controller更新所有视图 - 因此必须知道哪些视图需要特别小心和提供以避免循环.相反,只有具有麻烦的UI元素的单个View必须处理该问题.
感谢那些回答我问题的人!
只是回顾一下 MVC 模型。视图通常应该自行更新。它的工作原理如下:控制器更改模型的状态,模型将更新发送到其视图,视图从模型中提取新状态并更新自身。虽然控制器和视图通常是捆绑在一起的(即以图形表示方式深入研究数据),但它们永远不应该直接交互,而只能通过模型进行交互。当然这是一般情况。
因此,更新视图的 JS 函数实际上并不是控制器,这是一个重要的区别。它们应该被视为您观点的一部分。这可能对解决当前的问题没有帮助,但我认为值得指出。
您也不能删除模型,我假设您的意思是从模型中删除某些内容,因为如果没有模型支持,则任何视图或控制器实际上都不存在(或处于功能状态)。
我不是一个 JS 代码骑师,也没有使用过 gmap,我真的不明白问题出在哪里。更改复选框(checked 属性)的状态是否会触发 onClick() 事件?恕我直言,它确实不应该,但也许他们是这样实现的,否则你可以将控制器附加到 onClick() 并向复选框添加一些逻辑(或者,这是 JS,在某个函数中)来更改复选框状态。如果这不可能,选项 1 和 2 绝对是您的最佳选择。
那么当用户想要与视图交互时会发生什么?通常,小部件将包含视图和控制器。复选框有一个视图(您可以查看它是否被选中)和一个控制器(您可以单击它)。当您单击该复选框时,原则上会发生以下情况:
第一步,控制器如何接收事件在某种程度上取决于语言,但在 OOP 语言中,它可能是附加到此特定小部件上的用户界面事件的侦听器对象,该小部件要么是控制器,要么通知控制器用户交互。
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |