2013-06-03 3 views
2

Я маршрутизатор настроить следующим образом:Как извлечь идентификатор параметров из Backbone Router

var Router = Backbone.Router.extend({ 
    routes: { 
     "/SomeApp/Scene/:id": "main", 
    } 

    main: function (sceneId) { 
     console.log(sceneId); 
    } 
}); 

и инициализирован здесь:

$(document).ready(function() { 
    var router = new Router(); 
    Backbone.history.start(); 
}); 

Когда я посещаю http://localhost:12345/SomeApp/Scene/5, маршрут от routes объекта не соответствует, и main() не вызывается.

Если создать маршрут с пустым ключом, например:

routes: { 
    "": "main", 
} 

затем основной() называется, но, конечно, без каких-либо параметров.

Может ли кто-нибудь указать, что я неправильно понял о том, как работают параметры маршрута, и/или как я должен настраивать маршруты?

Спасибо.

Редактировать

Важный момент, который я хотел бы упомянуть, первоначально в том, что приложение в настоящее время подается с/SomeApp/сцен на сервере, а не от корня сайта.

+0

Вы попробовали '' SomeApp/Scene /: id "'? – jantimon

+0

@jantimon Да. Я также попытался вызвать «Backbone.history.start ({root: '/ SomeApp, pushstate: true}); и изменить ключ маршрута только на« Сцена /: id », но это тоже не сработало. По общему признанию, это был какой-то удар в темноте. – Twicetimes

+0

Используйте общий маршрут, чтобы легко проверить, какой формат маршрута: ''* path': 'display'' и' display: function (path) {alert (path);} '. Затем вы сможете правильно настроить свой корень и маршруты. – Loamhoof

ответ

1

Если вы служите из /SomeApp/Scene вам нужно передать, что, как root парам в Backbone.history:

$(document).ready(function() { 
    var router = new Router(); 
    Backbone.history.start({pushState: true, root:'/SomeApp/Scene/'}); 
}); 

Если вы не собираетесь использовать хэш (#) вы должны пройти pushState: true, иначе иначе он не будет соответствовать.

маршрут:

routes: { 
":id": "main", 
} 

выше будет соответствовать: http://localhost:12345/SomeApp/Scene/5 с pushState: true и http://localhost:12345/SomeApp/Scene/#5 без него.

+1

Я думал, что пробовал каждую комбинацию значений «root» и маршрута, но да, ваше решение работает. Спасибо, что разъяснил все. Я думаю, что я, возможно, даже нажимал 'pushstate' вместо' pushState' при некоторых попытках, но никому не говорю :) – Twicetimes

+0

Рад, что я мог бы помочь! – Maroshii

0

Вы забыли включить underscore.js перед backbone.js? Пример здесь работает

http://imstillreallybored.com/bb.html#search/test

var Router = Backbone.Router.extend({ 
       routes:{ 
        "search/:query": "search" 
       }, 
       search: function(search){ 
        alert('search ' + search); 
       } 
}); 

var app_router = new Router(); 
Backbone.history.start(); 
//app_router.navigate('#search/' + $.trim($(this).val())); 
+0

Нет, они, безусловно, оба загружены в правильном порядке (с использованием require.js) – Twicetimes

+0

попробуйте не иметь косой черты в начале вашего маршрута ex:/Someapp/Сцена к ex: Someapp/Scene –

+0

Я, вероятно, должен был указать что приложение Backbone обслуживается с '/ SomeApp/Scene' на сервере, а не из корня сайта, поэтому я не хочу посещать'/# SomeApp/Scene/5', иначе он будет обслуживать индекс сайта по умолчанию (который для чего-то еще). В принципе, я просто хочу, чтобы позвоночник мог получить идентификатор сцены из пути 'SomeApp/Scene/5'. – Twicetimes

Смежные вопросы