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');
});