позвоночник.js - как общаться между представлениями?
У меня есть одностраничное веб-приложение с несколькими магистралями.вид на JS. Взгляды иногда должны взаимодействовать друг с другом. Два примера:
- когда есть два способа представления коллекции различными способами одновременно и нажмите на элемент в одном представлении должны быть переданы в другое представление.
- когда пользователь переходит к следующему этапу процесса, а первое представление передает данные второму.
отделить взгляды насколько это возможно, в настоящее время я использую пользовательские события для передачи данных ($(document).trigger('customEvent', data)
). Есть ли лучший способ сделать это?
3 ответов
один широко используемый метод расширяет Backbone.Events
- объект для создания личного агрегатора глобальных событий.
var vent = {}; // or App.vent depending how you want to do this
_.extend(vent, Backbone.Events);
В зависимости от того, используете ли вы requirejs или что-то еще, вы можете разделить это на свой собственный модуль или сделать его атрибутом вашего объекта приложения. Теперь вы можете запускать и слушать события в любом месте вашего приложения.
// View1
vent.trigger('some_event', data1, data2, data3, ...);
// View2
vent.on('some_event', this.reaction_to_some_event);
Это также позволяет использовать агрегатор событий для связи между модели, коллекции, маршрутизатор etc. вот концепция Мартина Фаулера для агрегатора событий (не в javascript). А вот еще backboney реализация и размышление на эту тему больше в духе позвоночника.Марионетка, но большая ее часть применима к ванильному позвоночнику.
надеюсь, что это помогло!
Я согласен с @jakee в первой части
var vent = {};
_.extend(vent, Backbone.Events);
однако прослушивание глобального события с " on " может вызвать утечку памяти и проблему просмотра зомби, а также вызвать несколько вызовов обработчика действий и т. д.
вместо " on "вы должны использовать" listenTo " в своем представлении
this.listenTo(vent, "someEvent", yourHandlerFunction);
таким образом, когда вы удалите свой вид view.remove()
этот обработчик будет также удалена, потому что обработчик привязан к вашему мнению.
при запуске вашего глобального события, просто использовать
vent.trigger("someEvent",parameters);
jakee это предлагает прекрасный подход, который я сам использовал, но есть еще один интересный способ, и это ввести ссылку на объект в каждый экземпляр представления, а введенный объект, в свою очередь, содержит ссылки на столько представлений, сколько вы хотите объединить.
по сути, view-aggregator является своего рода объектом" App", и вещи рядом с представлениями могут быть прикреплены, например коллекции. Это связано с расширением представления(ов), и поэтому может не быть вкус каждого, но, с другой стороны, расширение служит простым примером для этого.
я использовал код в http://arturadib.com/hello-backbonejs/docs/1.html в качестве основы для моего ListView, а затем я получил следующее Для работы:
define(
['./listView'],
function (ListView) {
var APP = {
VIEWS : {}
}
ListView.instantiator = ListView.extend({
initialize : function() {
this.app = APP;
ListView.prototype.initialize.apply(this, arguments);
}
});
APP.VIEWS.ListView = new ListView.instantiator();
console.log(APP.VIEWS.ListView.app);
}
);