【问题标题】:Should a Controller access a view's model directly?控制器应该直接访问视图的模型吗?
【发布时间】:2013-11-17 10:23:56
【问题描述】:

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

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

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

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

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

问题:

那么问题来了,控制器是否应该直接访问shapeview的shapeModel并调用rotate方法呢? 要么 Controller应该调用shapeView的rotate方法,内部调用shapeModel的rotate方法吗?

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

【问题讨论】:

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


    【解决方案1】:

    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
    

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

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

    【讨论】:

    • 嗨,我的意思不是与多个控制器有关的东西。我的意思是控制器应该直接调用模型的旋转方法吗?还是只调用view的rotate方法,然后view处理内部rotate方法的调用。
    • 我的意思是,骨干中没有纯“控制器”的概念。 View 是某种控制器。视图应该听取模型的变化并在角度变化时进行旋转。什么都不会直接调用旋转方法。来自backbonejs.org 的引述“当模型发生变化时,视图只会自行更新。”
    • 是的,我接受控制器在 Backbone 中不存在的事实。但我的问题有点笼统,控制器应该直接访问某个视图的数据结构/模型吗?我希望这次我清楚了。
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2011-06-26
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多