Backbone.js Pushstate: true не возвращает функцию обратного вызова

Я довольно новичок в backbone js, и у меня возникли проблемы с работой функции pushstate моего приложения. Вот пример моего маршрута:

var TodoRouter = new (Backbone.Router.extend({
    routes: {
        "": "index",
        "item/add": "AddTodoItem",
        "list/add": "AddTodoList"
    },
    AddTodoItem: function() {
        //e.preventDefault();
        alert("add new item");
    },
    AddTodoList: function(e) {
        //e.preventDefault();
        alert("add new list");
    },
    Start: function(){
            //note: my directory structure is localhost/playground/todo/
        Backbone.history.start({pushState: true, root: "/playground/todo/"});
    }, 
    initalize: function(){

    }, 
    index: function(){
        var todoListView = new TodoListView({ collection: TodoItemCollection });
    }
}));

Вот как я называю свой маршрут:

$(function() {
    TodoRouter.Start();
});

И, наконец, вот как я называю ссылку:

<a href="#list/add" id="newList">New List</a>

Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю ссылку, страница остается прежней, без предупреждений и в браузере отображается:

http://localhost/playground/todo/#list/add

Теперь самое интересное, если я обновлю страницу, URL-адрес станет таким:

http://localhost/playground/todo/list/add 

и я получаю предупреждение. Так что у меня такое чувство, что я где-то упускаю ключевой момент. Любая помощь будет принята с благодарностью!


person Charles    schedule 02.07.2012    source источник


Ответы (2)


У вас есть pushState: true, и поэтому он предпочел косую черту / вместо решетки #

Либо измените это, либо удалите хэш

person HP.    schedule 10.10.2012

Вы пытаетесь использовать магистральные маршруты и html5 pushState.

Как сказано в базовой документации:

«если у вас есть маршрут /documents/100, ваш веб-сервер должен иметь возможность обслуживать эту страницу, если браузер посещает этот URL напрямую».

Поэтому, если вы хотите запускать некоторые функции через uri (localhost/webapp/#about), вам просто нужно использовать магистральные маршруты. Если вы хотите использовать Backbone Routes и pushState, вам понадобится серверная часть, чтобы отвечать на запросы, сделанные на ваш читаемый URL-адрес (localhost/webapp/about), и вам нужно использовать метод backbone.navigate, чтобы браузер не воспринимал <a href="#someRoute"> как привязку html.

здесь вы можете увидеть полный пример

Вы не можете активировать свой маршрут, потому что когда pushState:true, href="#route" ведет себя так же, как якорь html.

person Claudio Santos    schedule 24.09.2013