Как передавать данные из одного представления в другое с помощью настраиваемых событий?

Скажем, у меня есть представление, которое отображает окно поиска с кнопкой отправки. Когда я нажимаю кнопку отправки, как передать значение окна поиска в другое представление?

Я пробовал:
В поле зрения 1, внутри обратного вызова submit: this.trigger('abc', $('#searchBox').val())
В представлении 2, в функции инициализации: this.bind('abc', function(data){ console.log(data); })

но это не работает: пользовательское событие запущено, но View 2 не видит его.

Ответ 1

К сожалению, вы не можете привязать этот путь - вам нужно будет предоставить ссылку на view1 в view2:

var View2 = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, 'foo');
        this.view1.bind('abc', this.foo);        
    },
    foo: function(data) {
        console.log(data);
    }
});

Это также означает, что в какой-то момент вам нужно установить view1 в свой экземпляр View2, чтобы вы могли привязать его.

Если вы не хотите передавать ссылки вокруг, просто привяжите два представления вместе в любом контейнере, в котором вы их удерживаете (например, в другом представлении или контроллере):

var view1 = new View1();
var view2 = new View2();

view1.bind('abc', view2.foo);

Ответ 2

Вот отличная статья Дерика Бэйли @LosTechies.com: Ссылки, маршрутизация и агрегатор событий: координация просмотров в Backbone.js

В этой статье рассматривается простое решение с использованием PubSub, встроенного в Backbone.JS. Я согласен с Дериком, когда он упоминает, что мнения должны быть развязаны.

Ответ 3

Я предлагаю использовать структуру PubSub в дополнение к основному. MinPubSub - популярный выбор. Я использую расширение jubsery pubsub, извлеченное из https://github.com/phiggins42/bloody-jquery-plugins.

Затем View 2 не нуждается в ссылке на View 1. Чтобы изменить пример Andrew Hare, вы должны:

  var View2 = Backbone.View.extend({
      initialize: function() {
          _.bindAll(this, 'foo');
          $.subscribe('abc', this.foo);        
      },
      foo: function(data) {
          console.log(data);
      }
  });

Тогда в представлении 1:

$.publish('abc', $('#searchBox').val());

Конечно, с системой pubsub вы, вероятно, захотите использовать что-то лучше, чем "abc", возможно, вместо этого выберите "searchBox: submit" в качестве темы.