Backbone pubsub - глобальное событие, не запускаемое внутри маршрута по умолчанию при загрузке страницы

Я создал объект pubSub с Backbone следующим образом:

App.Vent = _.extend({}, Backbone.Events);

Я также создал маршрутизатор, который запускает глобальное событие по умолчанию URI: http://localhost/

App.Router = Backbone.Router.extend({
    routes: {
        '': 'default',
    },

    default: function() {
        App.Vent.trigger('contactsTable:show');
    }
});

App.Views.ContactsTable = Backbone.View.extend({

    tagName: 'ul',

    initialize: function() {
        App.Vent.on('contactsTable:show', this.updateApp, this);
    },

    updateApp: function() {
        console.log( 'Show All Contacts' );
    }

});

new App.Router;
Backbone.history.start();
new App.Views.ContactsTable;

Метод default успешно вызвано но событие (contactsTable:show) внутри метода не срабатывает.

Однако, если я загружаю страницу изначально, скажем: http://localhost/#contacts а затем вернитесь к http://localhost/ оттуда событие запускается внутри метода маршрутизатора.

Я не могу понять, почему это может быть. Мне нужно, чтобы событие запускалось по маршруту по умолчанию, независимо от того, является ли это первым маршрутом при открытии приложения.

2 ответа

Решение

Чтобы ответить на мой собственный вопрос, моя проблема заключалась в том, что router а также Backbone.history.start() были вызваны до привязки слушателя события, на мой взгляд.

Это происходило потому, что мое представление (которое содержит прослушиватель) создавалось внутри функции обратного вызова запроса AJAX и Router а также Backbone.history.start() был выполнен до того, как сервер вернул ответ.

Это рабочий код, который у меня сейчас есть после определения моих моделей, коллекций представлений и маршрутизатора:

var contactsCollection = new App.Collections.Contacts();
contactsCollection.fetch().then(function() {

    var contactsTableView = new App.Views.ContactsTable({
        collection: contactsCollection
    });

    new App.Router;
    Backbone.history.start();

});

Слушатель внутри моего представления теперь реагирует на событие при начальной загрузке страницы.

Похоже, в App ничего нет.Vent связывается с "contactsTable:show", добавьте следующую строку и проверьте, видите ли вы сообщение в консоли.

App.Vent.bind("contactsTable:show", function(){
    console.log('Inside - contactsTable:show');
});
Другие вопросы по тегам