Я новичок в Backbone.js , и я пытаюсь выяснить , где должны находиться переменные состояния .Мой пример использования:
У меня есть приложение, которое предоставляет интерфейс для чтения книги (я знаю, классический пример, верно?).Мои модели Book
и Page
с классами коллекций для каждого.Структура приложения выглядит примерно так (простите за ASCII):
+------------+
| Controller |
+------------+
| Views Models
| +--------------+ +----------------+
|-| IndexView |------| BookCollection |
| +--------------+ +----------------+
| |
| +--------------+ +----------------+
+-| BookView |------| Book |
+--------------+ +----------------+
| |
| +--------------+ |
|-| TitleView |-+ |
| +--------------+ | +----------------+
| +-| Page |
| +--------------+ | +----------------+
+-| PageView |-+
+--------------+
То есть Controller
создает и координирует два вида, IndexView
и BookView
, поддерживаемые моделями,BookView
создает и координирует набор подпредставлений (на самом деле их здесь больше, чем показано).
Информация о состоянии включает в себя:
- текущая книга (указатель или идентификатор)
- текущая страница (указатель или идентификатор)
- другие переменные состояния пользовательского интерфейса, например, являются ли изображения на странице видимыми или нет, открыты или закрыты другие виджеты и т. Д.
Мой вопрос: где должна храниться эта информация о штате?Возможные варианты:
модели , которые могут быть осведомлены о состоянии.Это имеет некоторый смысл, поскольку они предназначены для хранения данных, и представления могут прослушивать изменения состояния, но не похоже, что это соответствует намеченному шаблону Backbone.js и не всегда имеет смысл (например, включение изображения вPageView
должен применяться ко всем страницам, а не только к текущей)
A специальная одноэлементная модель , предназначенная для хранения информации о состоянии.Опять же, имеет смысл, легко слушать, все представления могут связываться с ним - но опять же, это кажется вне стандартного MVC.
views , которыеотвечает за состояние пользовательского интерфейса - но для этого требуется, чтобы представления были осведомлены друг о друге, чтобы получить информацию о состоянии, которая кажется неправильной
Контроллер , который должен маршрутизироватьприменение между состояниями - это имеет смысл, но оно подразумевает немного странное путешествие туда и обратно, например 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, но у меня возникли проблемы с пониманием. Какая часть приложения должна отвечать за сохранение текущего состояния?
ОБНОВЛЕНИЕ: Для дальнейшего использования я использовал глобальную модель одноэлементного состояния для этой проблемы.Поток пользовательского интерфейса выглядит следующим образом:
- Обработчики пользовательского интерфейса просмотра ничего не делают, кроме обновления
app.State
- Мои маршрутизаторы также ничего не делают, кроме обновления
app.State
- это по сути специализированные представления, которыеотображать и реагировать на изменения URL - Просматривать изменения можно на
app.State
и обновлять соответственно
Мое приложение с открытым исходным кодом - вы можете увидеть код на Github .Соответствующим элементом здесь является модель состояния , которую я расширил, чтобы иметь дело с (де) сериализацией состояния для URL.