是视图中的事件处理程序或 MVC 应用程序中的控制器

Are event handlers in the view or the controller in an MVC application?

本文关键字:MVC 应用程序 控制器 事件处理 视图 程序      更新时间:2023-09-26

我目前正在注册一门关于JavaScript设计模式的课程,我想澄清事件处理程序的正确位置。

我注意到我的教授的代码在视图部分包含客户端应用程序的点击处理程序 - 我的代码实现了相同的结果,但我在控制器中包含点击处理程序。

在 MVC 应用程序中,事件处理程序应该位于视图还是控制器中?

在 MVC 应用程序中,事件处理绝对应该放在视图中。程序员普遍误以为事件处理属于控制器,可能是因为它的名字(控制器=sth.控制sth......)。原因是可移植性、代码重用和模块化:想象一下,你想在不同的平台上运行你的应用程序:PC、Web、手机设备。每个特定的平台都有自己的GUI框架,库等,所以如果你在视图中放置100%特定于GUI平台的事件处理内容(例如javafx,swing,android,struts,gwt......),你可以重用控制器和模型,只需要处理一个新的自定义视图。控制器可以看作是视图和模型之间的中介,一个负责模型和视图之间正确交互的中间件。

我认为网络中的MVC只能真正松散地被认为是真正的MVC。在 ASP.Net MVC的情况下,你的javascript事件只能真正成为视图的一部分(尽管应该分成js文件)。

如果你想将js事件与视图完全分开,你将很难过。您最好做出明智的决定,确定哪些事件实际上只与视图相关,哪些事件需要与控制器交互。

例如,单击菜单项以展开和显示子项是"事件",但控制器不需要知道它。但是,基于某些选择加载数据需要将数据发布或通过 ajax 提交到控制器。

通常,视图除了呈现之外不应有任何逻辑。因此,如果您的处理程序需要调用服务器(或执行与渲染无关的其他操作),则它应该在模型或控制器中(取决于框架)。如果你的处理程序需要做一些动画,该逻辑可能应该保留在视图中(如果动画只与视图有关)。

通常,当某个事件在视图上被触发时,它会在其模型(视图模型)上调用一些方法来更新模型的状态。当模型完成更新其状态(与服务器同步)时,它会触发其视图侦听的事件。当视图看到其模型已更新时,它会重新渲染自身。

控制器

(或者如果它充当控制器,也可以是一个路由器)通常只实例化视图和模型。

实际上,所有这些都可能取决于您选择的框架。我使用骨干.js。