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

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

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

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

3 ответов


к сожалению, вы не можете связать таким образом - вам нужно будет поделиться ссылкой на 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);

вот отличная статья на Дерик Bailley @ LosTechies.com: Ссылки, Маршрутизация И Агрегатор Событий: Координация Представлений В Магистрали.js

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


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

тогда View 2 не нуждается в ссылке для просмотра 1. Чтобы изменить пример Эндрю Хэйра, вы должны сделать:

  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 " в качестве темы.