Я новичок в Backbone.js, и я пытаюсь выяснить , где должны существовать переменные состояния. Мой прецедент:
У меня есть приложение, которое предоставляет интерфейс чтения для книги (я знаю, классический пример, правильно?). Мои модели Book
и Page
с классами сбора для каждого. Структура приложения выглядит примерно так (простить ASCII visio):
+------------+
| Controller |
+------------+
| Views Models
| +--------------+ +----------------+
|-| IndexView |------| BookCollection |
| +--------------+ +----------------+
| |
| +--------------+ +----------------+
+-| BookView |------| Book |
+--------------+ +----------------+
| |
| +--------------+ |
|-| TitleView |-+ |
| +--------------+ | +----------------+
| +-| Page |
| +--------------+ | +----------------+
+-| PageView |-+
+--------------+
То есть, Controller
создает и сопоставляет два вида, IndexView
и BookView
, подкрепленные моделями. BookView
создает и координирует набор подпунктов (на самом деле здесь больше, чем показано здесь).
Информация о состоянии включает:
- текущая книга (указатель или идентификатор)
- текущая страница (указатель или идентификатор)
- другие переменные состояния пользовательского интерфейса, например, видны ли изображения на странице или нет, открыты или закрыты другие виджеты и т.д.
Мой вопрос в том, где должна находиться эта информация о состоянии? Возможные варианты:
-
модели, которые могут быть осведомлены о состоянии. Это имеет смысл, поскольку они предназначены для хранения данных, а представления могут прослушивать изменения состояния, но похоже, что это не соответствует намеченному шаблону Backbone.js и не всегда имеет смысл (например, включение изображения в
PageView
должен применяться ко всем страницам, а не только к текущему) -
A специальная одноэлементная модель, предназначенная для хранения информации о состоянии. Опять же, имеет смысл, легко слушать, все взгляды могут привязываться к нему, но опять же это кажется вне стандартного MVC.
-
представления, ответственные за состояние пользовательского интерфейса, но это потребует, чтобы представления знали друг о друге, чтобы получить информацию о состоянии, которая кажется неправильной
-
Контроллер , который должен маршрутизировать приложение между состояниями - это имеет смысл, но это подразумевает слегка нечетное круговое движение, например.
User selects "Show Images" --> View event listener is called --> View informs Controller --> Controller updates state --> Controller updates View
(а не простоUser selects "Show Images" --> View event listener is called --> View updates
)
Я предполагаю, что в некотором роде это общий вопрос MVC, но у меня проблемы с его головой. Какая часть приложения должна отвечать за сохранение текущего состояния?
UPDATE:. В будущем для этой проблемы я использовал глобальную модель состояния Singleton. Поток пользовательского интерфейса выглядит следующим образом:
- Обработчики пользовательского интерфейса ничего не делают, кроме обновления
app.State
- Мои маршрутизаторы также ничего не делают, кроме обновления
app.State
- это по сути специализированные представления, отображающие и реагирующие на изменения URL. - Представления прослушивают изменения на
app.State
и соответственно обновляют
Мое приложение - Open Source - вы можете увидеть код на Github. Ниже приведена соответствующая статья State model, которую я расширил, чтобы обработать (де) сериализующее состояние для URL-адреса.