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 внутренне обрабатывает всю сантехнику этого шаблона дизайна, поэтому вы в значительной степени получаете его бесплатно:)

Вышеприведенный код может не работать как есть, но есть, чтобы дать вам представление об этом...