Я пишу приложение Backbone, используя RequireJS для определения модулей. Я столкнулся с давней проблемой, как обойти агрегатор событий, не используя глобальные переменные и не передавая его в качестве параметра каждому отдельному представлению.
vent = _.extend({}, Backbone.Events);
Я использовал подход , используемый здесь для Marionette, но поскольку я (пока) не использую Marionette, я адаптировал его для использования старого скучного объекта vent
:
vent.js:
define(['underscore', 'backbone'], function (_, Backbone) {
return _.extend({}, Backbone.Events);
});
Итак, теперь в моих различных модулях я могу публиковать и подписываться, например:
запрос-list-view.js:
define(['backbone', 'vent'], function (Backbone, vent) {
var EnquiryListView = Backbone.View.extend({
events: {
'click .enquiry-list-item-manage': 'manageClick'
},
manageClick: function () {
vent.trigger('navigate', 'enquiry/' + id);
}
});
});
app-router.js:
define(['backbone', 'vent'], function (Backbone, vent) {
var AppRouter = Backbone.Router.extend({
routes: {
'enquiry/:id': 'enquiryManage'
},
initialize: function () {
//listen out for navigate events
this.listenTo(vent, 'navigate', this.gotoRoute);
},
gotoRoute: function (route) {
this.navigate(route, { trigger: true });
}
});
Этот шаблон работает нормально, маршрутизатор может прослушивать объект vent
, а представление может инициировать для него событие.
Но... как маршрутизатор и вид смотрят на один и тот же объект? Разве return _.extend({}, Backbone.Events);
в vent.js не всегда возвращает новый объект каждый раз, когда он требуется другому модулю?
Есть ли что-то в RequireJS, чего я не понимаю, или _.extend
что-то делает с Backbone.Events
, или, возможно, есть что-то (еще) в JavaScript, что я не совсем понимаю?