我应该让保存按钮(视图)传递一个带有当前字段状态的对象以及事件(视图中的一些逻辑)吗?
是的,这不是“视图中的逻辑”,它不决定任何事情,只是报告一个动作及其当前状态
我是否应该允许控制器保持对视图的访问并让控制器自己找出字段中的内容(增加耦合)?
不,这会变得非常混乱,请在活动中传递 VO
每次更改表单中的字段并且控制器跟踪每个字段的状态(大量事件)时是否应该进行事件?
是一个选项,但这基本上与点击保存按钮相同,触发器不同(TextField.onChange),但您可以调度相同的事件(设置是 form = view,使用 VO 调度一个通用事件,而不是每个字段的事件)
还是他们的另一种方式?
带有事件的 MVC 流:
- onClick save btn:调度一个RecipeEvent.SAVE(从视图中),带有一个包含Recipe数据的VO(值对象)(例如RecipeVO)
- 控制器捕捉到这一点,并且由于控制器是逻辑所在的位置,它决定如何处理它:更新RecipesModel(直接通过调用模型上的方法,或通过自定义事件,例如RecipeModelEvent.SAVE)
- 模型存储数据,并调度 RecipeEvent.UPDATE 事件(使用 RecipeVO)
- 视图会相应更新(检查 RecipeVO.ID 是否相同,更新数据表示,例如标题……)
- 可选地,控制器可以将数据保存到后端/远程数据库
至于事件监听器:视图监听模型,控制器监听视图。
关于解耦:使用接口(通过使用 IModel,您可以轻松地将模型替换为另一个实现,因为您针对接口而不是实际实现注册事件侦听器)
显然,所有这些都会导致大量注册/删除事件侦听器,并保持对模型/视图/控制器的引用,以便能够注册到适当的实例。另一种方法是使用框架作为 RobotLegs,因为它使中央事件总线可用 + 在视图的中介类中轻松/自动清理事件侦听器。