Централизация агрегатора событий магистрали в RequireJS — как это работает?

Я пишу приложение 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, что я не совсем понимаю?


person Simon Adcock    schedule 27.01.2014    source источник


Ответы (1)


В AMD функция обратного вызова define выполняет только единицы. Его результат используется во всех зависимых модулях. Оформить это сообщение. Я думаю, что ваш вопрос связан с этим.

person Andrew Shustariov    schedule 27.01.2014
comment
Круто, спасибо, что прояснил это. Миллион идей по развязке только что промелькнули перед моими глазами. RequiresJS — это очень хорошо :) - person Simon Adcock; 28.01.2014