Магистральный маршрутизатор не работает с pushState

Я хочу, чтобы каждый запрос страницы перенаправлялся на мой index.html, и любая ссылка (не #urls - /real/urls) щелкалась в моем приложении для запуска через router.js, чтобы по существу не было обновлений страницы - чисто ajax . Есть ли простой способ сделать это с помощью магистральной маршрутизации и htaccess?

У меня это работает на данный момент, если я уберу {pushState: true} и отформатирую свои ссылки как #login. Однако, когда я включаю pushState и нажимаю #login, ничего не происходит. Вместо этого, только когда я обновляю страницу, Backbone интерпретирует #login и следует маршруту для отображения loginView.

Вот мой роутер:

// Filename: router.js
define( [ 'views/beta/requestInvite', 'views/beta/login' ],
function(requestInviteView, loginView) {
    var AppRouter = Backbone.Router.extend( {
        routes : {
            // Pages
            'login' : 'login',

            // Default
            '*actions' : 'defaultAction'
        },

        // Pages
        login : function() {
            loginView.render();
        },

        defaultAction : function(actions) {
            requestInviteView.render();
        }
    });

    var initialize = function() {
        var app_router = new AppRouter;
        Backbone.history.start({pushState: true});
    };
    return {
        initialize : initialize
    };
});

То, что я хотел бы сделать, это requestInviteView, когда нажимается ссылка на /login, URL-адрес изменяется на /login и отображается loginView.

Спасибо за любую помощь!


person Garrett    schedule 06.06.2012    source источник


Ответы (2)


Переход от хэша к pushstate не так тривиален, как изменение одного параметра, как может показаться. Что я делаю, так это ловлю событие щелчка в моем представлении и вызываю app.navigate для запуска маршрута.

app.navigate("/login", {trigger: true});

http://backbonejs.org/#Router-navigate

person Anthony Chua    schedule 06.06.2012
comment
Вы можете сделать это несколько автоматически, используя метод, аналогичный этой сути. - person colllin; 06.06.2013

Хотя ответ Энтони сработает, использование trigger: true обычно не лучший способ действий. Вместо этого ваше приложение должно быть структурировано так, чтобы вы могли вызывать navigate со значением trigger по умолчанию, оставленным равным false.

Дерик Бейли рассказывает об этой проблеме в своем блоге по адресу http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code./ (абзац «Момент «АГА!» по поводу второго аргумента Router.Navigate»)

Кроме того, целую главу с более подробным объяснением маршрутизации (включая то, почему вы должны оставить trigger для false) можно бесплатно скачать в этом образце книги в формате pdf: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (полное раскрытие: я автор книги)

person David Sulc    schedule 20.05.2013
comment
интересно, но дублирование логики для каждого контроллера только для того, чтобы избежать второго параметра, кажется излишним. у меня есть редкие сценарии, в которых я использую это (например, когда маршрут запрашивается не по порядку, я меняю его на лету и отображаю правильное представление). контекст этого вопроса заключается в том, чтобы инициировать действие после нажатия на ссылку, и imo я вижу, что это лучше всего сделать. - person Garrett; 21.05.2013