Должен ли контроллер получить доступ к модели представления напрямую?

Я сомневаюсь в использовании MVC в контексте следующего примера:

Рассмотрим пример небольшого приложения для рисования.

  1. Теперь, скажем, например, есть текстовое поле, в котором пользователь может ввести ANGLE для выбранной фигуры. Ожидаемый результат должен состоять в том, что каждая выбранная фигура должна поворачиваться на угол, указанный в текстовом поле.

  2. Скажем, у меня есть объект формы, который является представлением, названным как ShapeView. У данного представления есть свои собственные данные, такие как его положение, текущий угол поворота, цвет обводки, цвет заливки и т. Д. Итак, у меня есть модель для формы как ShapeModel

  3. Так что теперь у меня есть контроллер, который обрабатывает это текстовое поле и несколько видов фигур. Изменение значения текстового поля позволяет контроллеру предпринять необходимые шаги для поворота фигуры.

ВОПРОС:

Так что сомнение в том, должен ли контроллер напрямую обращаться к shapeModel shapeview и вызывать метод rotate? ИЛИ должен ли контроллер вызывать метод rotate shapeView, который внутренне вызывает метод rotate shapeModel?

Короче говоря, должен ли какой-либо внешний объект напрямую обращаться к модели представления? Или он должен пройти только через просмотр? Это хорошая идея, чтобы получить доступ к модели напрямую? Любые вопросы или проблемы, если я получу доступ так.?

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

Таким образом, вы можете иметь несколько контроллеров, слушающих одну и ту же модель данных, и соответственно обновлять представления.

Контроллеры модели и вида должны быть разъединены настолько, насколько это возможно.

Другие вопросы по тегам