控制器是否应直接访问视图的模型

Should a Controller access a view's model directly?

本文关键字:视图 模型 访问 是否 控制器      更新时间:2023-09-26

我对MVC在示例上下文中的使用表示怀疑,如下所示:

考虑一个小绘图应用程序的示例。

  1. 现在假设例如,有一个文本框,用户可以在其中输入所选形状的 ANGLE,预期结果应该是,每个选定的形状都应根据文本框中指定的角度旋转。

  2. 假设我有一个形状对象,它是一个名为 ShapeView 的视图给定的视图有自己的数据,如它的位置、当前旋转角度、笔触颜色、填充颜色等......所以我有一个形状模型作为形状模型

  3. 所以现在我有了控制器,它处理这个文本框和多个形状视图。文本框值的更改允许控制器采取必要的步骤来旋转形状。

问题:

所以问题是,控制器是否应该直接访问形状视图的 shapeModel 并调用旋转方法?或控制器是否应该调用 shapeView 的旋转方法,该方法在内部调用 shapeModel 的旋转方法?

简而言之,任何外部实体是否应该直接访问视图的模型?还是应该只通过视图?直接访问模型是个好主意吗?如果我访问,有任何问题或疑虑。?

Backbone 中的视图表现为控制器。

例如

  ShapeView = Backbone.View.extend
    el: "input#angle"
    events: 
      "onkeypress" : "update_angle"
    update_angle: (ev)->
      angle = $(ev.target).val()
      @rotate(angle)

大多数情况下,您不需要为同一视图添加其他控制器。ShapeView控制器可以自行处理所有事情。它负责为其创建的视图。如果您需要访问其他视图控制器或模型,您可以将它们挂接在全局命名空间上,例如 App = App || {}

如果您有许多值并且这些值需要从其他控制器访问,则可以创建一个Shape模型,该模型不应保留在视图控制器中,而应将其绑定到全局命名空间并通过全局命名空间设置其属性。

您还可以像这样绑定模型上的事件

shapeView = new ShapeView
shape = new Shape
shapeView.listenTo shape, "change:angle", shapeView.update_angle

这样,您可以拥有多个控制器,侦听相同的数据模型并相应地更新视图。

模型和视图控制器应尽可能分离。