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

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

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

Ответ 1

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

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

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

Ответ 2

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

Дерик Бэйли рассказывает о проблеме в своем блоге на http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (параграф "Момент AHA!" в отношении маршрутизатора. Обозначает второй аргумент ")

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