Controller应该直接访问视图的模型吗?

时间:2013-11-06 09:02:02

标签: javascript model-view-controller backbone.js mvvm simple-mvvm

我对MVC在上下文中的用法存在疑问,如下所示:

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

  1. 现在举例来说,有一个文本框,用户可以在其中为选定的形状输入ANGLE,预期的结果应该是,每个选定的形状应按照文本框中指定的角度旋转。

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

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

  4. 问题:

    所以怀疑是,控制器是否应该直接访问shapeview的shapeModel并调用rotate方法? 要么 Controller应该调用shapeView的rotate方法,内部调用shapeModel的rotate方法吗?

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

1 个答案:

答案 0 :(得分:1)

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

E.g。

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

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

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

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

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

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

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