Router backbone.js обрабатывает события

У меня очень сложное приложение 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();    

})();

Конечно, ваш сценарий маршрутизатора должен загружаться перед кодом вашего модуля. Он отлично подходит для моих нужд. С этой конструкцией я полностью разделил маршрутизатор/модули, и они также не знают друг друга. Каждый будет обрабатывать свои собственные события/данные и т. д. Общая логика находится в маршрутизаторе.


person iririr    schedule 04.09.2012    source источник
comment
к каким методам вам нужен доступ?   -  person jakee    schedule 05.09.2012


Ответы (1)


Вы должны разделить функциональность маршрутизатора на разные классы. В нашем приложении на основе марионеток мы используем RegionManager для обработки всех вещей, связанных с представлениями, таких как изменение представлений в разных областях, открытие оверлеев и т. д., а также StateMachine. Сам маршрутизатор просто запускает различные события, такие как состояние: изменение или регион: изменение, где прослушиваются классы менеджера.

Делая это таким образом, вы можете иметь разные классы менеджеров, которые обрабатывают особый аспект вашего приложения. Пусть роутер делает то, для чего он создан: прослушивает события смены местоположения и уведомляет об этом приложение. У маршрутизатора не должно быть другой логики, кроме этой.

person Andreas Köberle    schedule 14.09.2012
comment
С тех пор я перешел к подходу, который вы предложили. Спасибо - person iririr; 06.02.2014