Это один четко определенный вопрос!
Возникает вопрос, что такое модель. Я полагаю, что существует определенное определение того, что представляет собой модель в магистральном мире, и я не уверен, что ваша стратегия соответствует этому определению. Также вы сохраняете состояние как в URL, так и в модели. Вы можете просто сохранить состояние в URL, как я объясню.
Если бы я делал это, было бы 2 просмотра. Один для элементов управления вашего приложения и вложенный в него для вашего графика: GraphView и AppView. Модель будет данными, которые вы собираетесь построить, а не состоянием интерфейса.
Использование контроллера для запуска представления приложения, а также для обработки любого состояния интерфейса, определенного в URL.
Есть вопрос о рычагах состояния в Backbone. Традиционные веб-приложения использовали ссылку / URL в качестве основного рычага состояния, но все, что сейчас меняется. Вот одна из возможных стратегий:
Checkbox Change Event -> Update location fragment -> trigger route in controller -> update the view
Slider Change Event -> Update location fragment -> trigger route in controller -> update the view
Самое замечательное в такой стратегии состоит в том, что она заботится о случае, когда URL-адреса передаются или добавляются в закладки
Url specified in address bar -> trigger route in controller -> update the view
Я возьму удар по примеру с псевдокодом. Для этого я сделаю некоторые предположения относительно данных:
Данные представляют собой популяцию собак с течением времени (с детализацией по году), где ползунок должен иметь нижнюю и верхнюю границу, а объем данных слишком велик, чтобы загрузить все это клиенту сразу.
Сначала давайте посмотрим на Модель для представления статистических данных. Для каждой точки на графике нам нужно что-то вроде {население: 27000, год: 2003}
Давайте представим это как
DogStatModel extends Backbone.Model ->
и набор этих данных будет
DogStatCollection extends Backbone.Collection ->
model: DogStatModel
query: null // query sent to server to limit results
url: function() {
return "/dogStats?"+this.query
}
Теперь давайте посмотрим на контроллер. В этой стратегии, которую я предлагаю, контроллер соответствует своему названию.
AppController extends Backbone.Controller ->
dogStatCollection: null,
appView: null,
routes: {
"/:query" : "showChart"
},
chart: function(query){
// 2dani, you described a nice way in your question
// but will be more complicated if selections are not mutually exclusive
// countries you could have as countries=sweden;france&fullscreen=true
queryMap = parse(query) //
if (!this.dogStatCollection) dogStatCollection = new DogStatCollection
dogStatCollection.query = queryMap.serverQuery
if (!this.appView) {
appView = new AppView()
appView.collection = dogStatCollection
}
appView.fullScreen = queryMap.fullScreen
dogStatCollection.fetch(success:function(){
appView.render()
})
}