Backbone.js: связь между представлениями
Я работаю над приложением Backbone, которое содержит список записей, подобно примеру приложения Todos (http://documentcloud.github.com/backbone/examples/todos/index.html).
Итак, у меня есть вид приложения и одно представление для элемента списка. Теперь, скажем, у меня есть глобальная кнопка редактирования. В представлении App будет обрабатываться щелчок, и то, что я тогда хочу сделать, - это показать в каждом представлении списка кнопку удаления.
На скриншотах ниже (из Spotify) нажатие кнопки "Изменить" приводит к изменению внешнего вида всех видов списка.
Какой лучший способ сделать это с помощью Backbone. Мне нужно перебрать все виды списков и вызвать функцию editMode. Но представление App (из коробки) не знает о представлениях списка.
![enter image description here]()
Ответы
Ответ 1
Недавно я написал статью о нескольких вариантах для координации между представлениями: http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/
в вашем случае, я бы рекомендовал использовать агрегатор событий, который я описываю в этой статье. вы могли бы просмотреть каждый элемент для просмотра события "editmode" или чего-то подобного. когда это событие срабатывает, каждый просмотр, который прослушивал его, обновил бы себя, чтобы перейти в режим редактирования. то вы сделаете обратное, когда вы нажмете "done" - отправьте событие "viewmode" или что-то подобное, и каждый просмотр будет соответствующим образом обновлен соответствующим образом.
Ответ 2
Мои два цента: есть простой "взлом", который вы можете сделать с помощью backbone.js, чтобы на самом деле иметь паб/суб, который может связываться между представлениями:
Что-то вдоль этих строк (непроверено):
var EventBus = Backbone.Model.extend({
publish: function(event, args){
this.trigger(event, args);
},
subscribe: function(event, args) {
this.bind(event, args);
}
});
Вы в основном получаете идею. Теперь для каждого представления привяжите его к этому EventBus (поскольку представления могут привязываться только к моделям/коллекциям в магистрали) - вы в основном просто используете имена методов publish/subscribe для синхронизации с номенклатурой такой модели, но вы может выбрать не делать этого. Просто создайте пустой EventBus
'class' в этом случае и привяжите к нему каждое представление:)
Таким образом, каждая точка зрения должна быть привязана к этому EventBus
и действовать на полученные события! Backbone.js внутренне обрабатывает всю сантехнику этого шаблона дизайна, поэтому вы в значительной степени получаете его бесплатно:)
Вышеприведенный код может не работать как есть, но есть, чтобы дать вам представление об этом...