1

首先,我在网络上(包括这个网站)做了很多研究,发现了很多关于模型和控制器如何在 MVC 模式中通信的相互矛盾的信息。这是我的具体问题(我使用的是 AS3),但这是一个一般的 MVC 问题......

我有两个主要组成部分......一个食谱列表和一个显示所选食谱的表单。表单具有编辑状态,允许您编辑配方,然后保存或取消更改。处理对配方所做的更改的最佳方式是什么(使用 MVC 原则)?到目前为止,我让保存按钮触发了一个由控制器捕获的事件。

我应该让保存按钮(视图)传递一个带有当前字段状态的对象以及事件(视图中的一些逻辑)吗?我是否应该允许控制器保持对视图的访问并让控制器自己找出字段中的内容(增加耦合)?每次更改表单中的字段并且控制器跟踪每个字段的状态(大量事件)时是否应该进行事件?还是他们的另一种方式?注意:我不想将字段绑定到模型,因为我只想在单击保存按钮时保存数据。

任何帮助将不胜感激。谢谢!

4

3 回答 3

0

我认为这确实是一个数据库问题。我要做的是创建一个存储过程,首先检查配方是否已经存在。如果是,则更新它。如果没有,则添加新配方。(您必须将实体绑定到存储过程。其他 MVC 框架可以做到这一点。我不知道 actionscript)

如果这不是一个选项,那么我想您必须将原始表单缓存在控制器的帮助器类中,然后将其与用户尝试保存的内容进行比较。并让控制器决定是否更新配方。

我认为使用第一种方式更清洁,但我从未使用过 actionscript 所以......

于 2012-08-20T18:37:36.083 回答
0

我应该让保存按钮(视图)传递一个带有当前字段状态的对象以及事件(视图中的一些逻辑)吗?

是的,这不是“视图中的逻辑”,它不决定任何事情,只是报告一个动作及其当前状态

我是否应该允许控制器保持对视图的访问并让控制器自己找出字段中的内容(增加耦合)?

不,这会变得非常混乱,请在活动中传递 VO

每次更改表单中的字段并且控制器跟踪每个字段的状态(大量事件)时是否应该进行事件?

是一个选项,但这基本上与点击保存按钮相同,触发器不同(TextField.onChange),但您可以调度相同的事件(设置是 form = view,使用 VO 调度一个通用事件,而不是每个字段的事件)

还是他们的另一种方式?

带有事件的 MVC 流:

  1. onClick save btn:调度一个RecipeEvent.SAVE(从视图中),带有一个包含Recipe数据的VO(值对象)(例如RecipeVO)
  2. 控制器捕捉到这一点,并且由于控制器是逻辑所在的位置,它决定如何处理它:更新RecipesModel(直接通过调用模型上的方法,或通过自定义事件,例如RecipeModelEvent.SAVE)
  3. 模型存储数据,并调度 RecipeEvent.UPDATE 事件(使用 RecipeVO)
    • 视图会相应更新(检查 RecipeVO.ID 是否相同,更新数据表示,例如标题……)
    • 可选地,控制器可以将数据保存到后端/远程数据库

至于事件监听器:视图监听模型,控制器监听视图。

关于解耦:使用接口(通过使用 IModel,您可以轻松地将模型替换为另一个实现,因为您针对接口而不是实际实现注册事件侦听器)

显然,所有这些都会导致大量注册/删除事件侦听器,并保持对模型/视图/控制器的引用,以便能够注册到适当的实例。另一种方法是使用框架作为 RobotLegs,因为它使中央事件总线可用 + 在视图的中介类中轻松/自动清理事件侦听器。

于 2012-08-20T19:41:51.283 回答
0

Colin Moock 在 ActionScript 中关于 MVC 的讲座已经很老了,但仍然是最好的解释之一:http ://www.moock.org/lectures/mvc/

Your model should populate your view, and your view should send input events to the controller, which should decide what to do with the input. As g10 says, wait until the save button is clicked and then pass an object with the modified fields up to the controller for processing. The controller can then decide whether or not to accept it, and whether to update an existing model object or create a new one.

于 2012-08-21T08:48:42.580 回答