Backbone.js: связь между представлениями - PullRequest
32 голосов
/ 20 сентября 2011

Я работаю над приложением Backbone, которое содержит список записей, очень похоже на пример приложения Todos (http://documentcloud.github.com/backbone/examples/todos/index.html).

Итак, у меня есть вид приложения и один вид на элемент списка. Теперь, скажем, у меня есть глобальная кнопка редактирования. Представление приложения будет обрабатывать щелчок, а затем я хочу, чтобы каждый вид списка отображал кнопку удаления.

На скриншотах ниже (из Spotify) нажатие кнопки «Редактировать» приводит к изменению внешнего вида всех представлений списка.

Какой лучший способ сделать это с Backbone. Мне нужно перебрать все списки и вызвать функцию editMode. Но представление приложения (из коробки) не знает о представлениях списка ..

enter image description here

Ответы [ 2 ]

41 голосов
/ 20 сентября 2011

Я недавно написал статью о нескольких различных вариантах координации между представлениями: http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

в вашем случае, я бы рекомендовал использовать агрегатор событий, который я описал в этой статье.вы можете заставить каждый вид элемента прослушивать событие «editmode» или что-то подобное.когда это событие срабатывает, каждое прослушивающее его представление обновляется, чтобы перейти в режим редактирования.тогда вы будете делать противоположное, когда нажимаете «готово» - отправляете событие «viewmode» или что-то подобное, и каждый вид обновляется соответствующим образом.

2 голосов
/ 24 сентября 2011

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

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

...