В глобальном масштабе есть слушатель click
, но приложение будет работать с трудом, поскольку оно растет. Вам лучше обрабатывать каждый View
как прямоугольник на странице, который только знает о вещах, которые происходят внутри себя. Когда нужно взаимодействовать с двумя представлениями, вам нужен какой-то способ координации между ними.
Одно простое предложение использовать модель в качестве шины события между двумя видами:
var ViewWithSearch = Backbone.View.extend({
events: {
'click .search' : 'searchKey'
},
initialize: function(options) {
this.eventModel = options.eventModel;
},
searchKey: function(event) {
this.eventModel.trigger('search', event)
}
});
var ReactingView = Backbone.View.extend({
initialize: function(options) {
this.listenTo(options.eventModel, 'search', this.onSearch);
},
onSearch: function(eventModel, event) {
console.log("Search was clicked!");
}
});
var eventModel = new Backbone.Model();
new ViewWithSearch({
eventModel: eventModel
}).render();
new ReactingView({
eventModel: eventModel
}).render();
Это, безусловно, сложнее, чем глобальное событие, но это также верно для MV*
дизайна. Вы получаете красиво развязанный набор взглядов, которые ничего не знают о себе «вне», что упрощает их обслуживание (и тестирование!).
Существует множество библиотек, которые предоставляют такую функциональность; например, Backbone.Radio построен именно для такого рода вещей.
Вы также можете 'eventBus = _.extend ({}, Backbone.Events)', если вам просто нужна глобальная система событий без какого-либо хранения. –
+1 к этому комментарию! На самом деле это то, что я делаю в некоторых производственных приложениях; просто не хотел расширять ответ, чтобы объяснить «Backbone.Events» тоже. –
Вы также можете найти Марионетт, легкое расширение MVC Backbone, которое добавляет контроллер для хранения таких обработчиков событий, сохраняя ваши модели и представления более сосредоточенными на том, что они должны делать. – billjamesdev