Backbone.js — привязка одного представления к другому?

У меня есть основное представление приложения с меню фильтров в заголовке. При нажатии я хочу фильтровать контент в отдельном представлении ленты новостей. Но я не знаю, как связать события (и передать данные класса) от кликов в одном представлении к функции в другом.

Как это сделать?


person Danny Anges    schedule 03.08.2011    source источник


Ответы (2)


Есть несколько способов сделать это, но, возможно, вы захотите создать объект модели, который будет использоваться совместно двумя представлениями. Затем при «щелчке» в первом представлении обновите объект модели и привяжите «при изменении» во втором представлении к объекту модели.

По сути, вы можете настроить оба представления так, чтобы они оставались синхронизированными с объектом модели, и любые изменения в объекте приведут к изменениям в представлении.

person idbentley    schedule 03.08.2011
comment
+1 Это определенно соответствует философии Backbone. - person Jethro Larson; 04.08.2011
comment
+1 Похоже, это правильный путь, но что, если у меня уже есть модель, используемая в представлении? также что, если представления, с которыми я хочу взаимодействовать, являются родительскими и дочерними (дочерние представления вложены внутри родителя)? - person vikmalhotra; 18.10.2011
comment
Я также обнаружил, что агрегатор событий, упомянутый здесь, тоже хорошо работает — -backbone-js/" rel="nofollow noreferrer">lostechies.com/derickbailey/2011/07/19/ - person vikmalhotra; 18.10.2011
comment
Дерик Бэйли повторно посетил агрегатор событий – Lostechies.com/derickbailey/2012/04/03/ - person timborden; 27.04.2012
comment
Мне не нравится это решение. Он создает тесную связь между компонентами. Это считается антипаттерном. - person srigi; 23.05.2012
comment
@srigi Как это анти-шаблон? - person R Brill; 03.02.2014

Все в Backbone наследуется от Backbone.Events, поэтому вы можете запускать и связывать события из любого места (документы для Backbone.Events ):

var View1 = Backbone.View.extend();

var View2 = Backbone.View.extend({
    eventHandler: function(data) {alert(data)}
});

var v1 = new View1;
var v2 = new View2;

v1.bind('hello-world-event', v2.eventHandler)
v1.trigger('hello-world-event', 'Hello World!')

Обратите внимание, что в этом примере, когда вызывается v2.eventHandler, this будет ссылаться на v1. Дополнительную информацию см. в основных документах.

person satchmorun    schedule 03.08.2011
comment
Что делать, если у меня нет двух переменных экземпляров представлений в одном и том же файле .js? - person Danny Anges; 03.08.2011
comment
Ну, что касается структуры приложения, у вас есть куча вариантов, как указал idbentley. Например, у вас может быть представление приложения, похожее на «контроллер», которое создает экземпляры некоторых подпредставлений, прослушивает события и соответственно отправляет их. - person satchmorun; 03.08.2011
comment
Пример не следует за вопросом. Вы запускаете событие в том же представлении, которое перехватывает событие. - person srigi; 23.05.2012