У меня очень сложное приложение Backbone с множеством представлений/моделей и коллекций.
иногда, когда пользователь нажимает кнопку, мне нужно обновить несколько коллекций и обновить определенные представления.
Чтобы управлять коллекциями, я обрабатывал большинство событий в своем маршрутизаторе. Последовательность событий такова:
пользователь нажимает ссылку/кнопку, и просмотр запускает событие:
this.model.trigger('someEvent');
модель прослушивает событие, при необходимости обновляет себя и уведомляет маршрутизатор через мою шину событий
eventbus.trigger('globalEVent');
Мой маршрутизатор прослушивает глобальные события, извлекает коллекции/модели из кэшированного хранилища и обновляет необходимые коллекции и модели.
До сих пор это работало очень хорошо, но
У меня слишком много событий, и мой код маршрутизатора становится трудноуправляемым. Мой вопрос: есть ли способ обрабатывать события вне маршрутизатора и по-прежнему получать доступ к методам внутри маршрутизатора? мой подход правильный или есть более элегантное решение, которое я не рассматривал?
Обновление:
Вот как я это делаю сейчас:
в Router я вызываю этот метод в моем initialize():
registerModules : function() {
var self = this;
Backbone.trigger(Events.RegisterModule, function(moduleRoutes) {
_.each(moduleRoutes, function(moduleRoute) {
self.routeDetails[moduleRoute.name] = {
buildPageUrl: moduleRoute.buildPageUrl,
fragment : moduleRoute.fragment
}
self.route(moduleRoute.fragment, moduleRoute.name, moduleRoute.action);
});
});
},
Затем у меня есть обычные блоки самоисполнения для каждого модуля/страницы, которые самостоятельно регистрируются (упрощенная версия):
(function() {
var module = {
loadAndDisplay: function() {},
saveAndContinue: function(model) {
Backbone.trigger(Events.ChangePage, model.get('nextPage'));
},
registerEvents: function() {},
_init: function() {
module.registerEvents();
var self = this,
routes = [{
fragment: Constants.FRAGMENT,
name: Constants.PAGE_NAME,
buildPageUrl: function() {
return Constants.FRAGMENT;
},
action: module.loadAndDisplay
}];
Backbone.on(Events.RegisterModule, function(registerCallback) {
registerCallback.call(registerCallback, routes);
});
}
};
module._init();
})();
Конечно, ваш сценарий маршрутизатора должен загружаться перед кодом вашего модуля. Он отлично подходит для моих нужд. С этой конструкцией я полностью разделил маршрутизатор/модули, и они также не знают друг друга. Каждый будет обрабатывать свои собственные события/данные и т. д. Общая логика находится в маршрутизаторе.