Магистральный маршрутизатор не соблюдает параметр trigger=false

Backbone.js предоставляет метод navigate(fragment, [options]) для своих объектов Backbone.router, который делает следующее (согласно документации):

Всякий раз, когда вы достигаете точки в своем приложении, которую хотите сохранить как URL-адрес, вызовите navigate, чтобы обновить URL-адрес. Если вы хотите также вызвать функцию маршрута, установите для параметра trigger значение true. Чтобы обновить URL-адрес без создания записи в истории браузера, установите для параметра replace значение true.

Таким образом, простой вызов appRouter.navigate('page'); предположительно изменит URL-адрес на www.myapp.com/page без активации соответствующего маршрута. Однако я обнаружил, что мой маршрутизатор перенаправляет на URL-адрес а также запускает маршрут страницы, несмотря на то, что по умолчанию trigger=false.

Таким образом, следующий код:

$(function(){
var AppRouter = Backbone.Router.extend({

    routes: {
        '': 'home',
        'page': 'page',
    },

    home: function() {
        window.app.navigate('page', {replace: true});        
        console.log('home route');    
    },

    page: function () {
        console.log('page route');
    },

});

window.app = new AppRouter();
Backbone.history.start({pushState: true});
});

производит следующий вывод консоли при переходе на www.myapp.com:

> home route
> page route

когда ожидаемый вывод консоли должен быть просто:

> home route

Похоже, метод не подчиняется параметру trigger по умолчанию. Это ошибка в реализации или я что-то не понимаю?


person Matm    schedule 26.06.2012    source источник
comment
правильно ли работает с набором trigger: false?   -  person jakee    schedule 26.06.2012
comment
@jakee: Нет, window.app.navigate('page', {trigger: false, replace: true}); по-прежнему ведет себя так же. Как и window.app.navigate('page');.   -  person Matm    schedule 26.06.2012
comment
снимите pushState: true с Backbone.history.start и попробуйте с исходным вызовом навигации. Я погуглил, и может быть связь между pushState: true и navigate не работает должным образом.   -  person jakee    schedule 26.06.2012
comment
Это сделало это. Он правильно перешел на #page, при этом запуская только домашний маршрут. Спасибо! Я бы очень хотел использовать это с pushState: true. Действительно ли это ошибка в реализации?   -  person Matm    schedule 26.06.2012
comment
Я не знаю, мой гуглинг выдал только расплывчатые замечания по этому поводу с 2011 года, и мне пришлось исправлять это самому. Я думаю, что это связано с реализацией pushState в API истории js. Но я добавлю ответ, и если вы хотите, вы можете принять его.   -  person jakee    schedule 26.06.2012


Ответы (2)


Обновление до последней версии Backbone от 28.06.12 (основная версия на https://github.com/documentcloud/backbone) решает проблему.

person Matm    schedule 29.06.2012

Снимите pushState: true с Backbone.history.start и попробуйте с исходным вызовом navigate.

Я погуглил в поисках решения этой проблемы, но все, что я получил, это расплывчатые замечания о API истории pushState: true, из-за которого функция навигации магистрального маршрутизатора не работает должным образом. Например, мои запросы в Google эта зачеркнутая статья была лучшим ресурсом по этому вопросу, который я смог найти.

person jakee    schedule 26.06.2012