Backbone.js предоставляет встроенный механизм маршрутизации, который позволяет управлять состоянием приложения через URL и связывать его с действиями внутри приложения. Основным компонентом для этого является объект Router. Он обеспечивает обработку изменений URL, синхронизацию состояния приложения и возможность программного перехода между маршрутами.
Маршруты задаются в объекте routes внутри класса
роутера. Ключи — это шаблоны URL, значения — имена методов, которые
вызываются при совпадении маршрута. Например:
var AppRouter = Backbone.Router.extend({
routes: {
"": "home",
"about": "showAbout",
"products/:id": "showProduct"
},
home: function() {
console.log("Главная страница");
},
showAbout: function() {
console.log("Страница о нас");
},
showProduct: function(id) {
console.log("Продукт с ID:", id);
}
});
var router = new AppRouter();
Backbone.history.start();
Особенности маршрутов:
:id) автоматически
передаются в соответствующий метод.routes: {
"search/:query": "search",
"files/*path": "showFile"
}
*path захватывает всю оставшуюся часть URL после
files/.
Backbone.js позволяет программно менять маршрут, не
дожидаясь действий пользователя. Для этого используется метод
navigate:
router.navigate("about", {trigger: true});
trigger: true — вызывает соответствующий метод маршрута
(showAbout).replace: true — заменяет текущую запись в истории
браузера, не добавляя новую.Комбинированное использование trigger и
replace позволяет гибко управлять навигацией и
историей:
router.navigate("products/42", {trigger: true, replace: true});
Backbone.js использует объект Backbone.history для
отслеживания изменений URL. Backbone.history.start() должен
быть вызван один раз после создания всех роутеров. Этот метод:
#about), так и
pushState (/about) при наличии соответствующей
конфигурации:Backbone.history.start({pushState: true});
В сложных приложениях часто требуется вложенная маршрутизация. Например, маршрут для страницы пользователя с вкладками:
routes: {
"user/:id": "showUser",
"user/:id/:tab": "showUserTab"
},
showUser: function(id) {
console.log("Пользователь:", id);
},
showUserTab: function(id, tab) {
console.log("Пользователь:", id, "Вкладка:", tab);
}
В этом примере, если URL /user/5/profile, будет вызван
метод showUserTab с параметрами id = 5 и
tab = "profile".
Для обработки URL, которые не соответствуют ни одному маршруту, можно
использовать маршрут по умолчанию с помощью регулярного
выражения *path:
routes: {
"*path": "defaultRoute"
},
defaultRoute: function(path) {
console.log("Страница не найдена:", path);
}
Это особенно полезно для реализации кастомной страницы 404 в одностраничных приложениях.
Маршруты часто используются для отображения соответствующих View компонентов:
var ProductView = Backbone.View.extend({
render: function(id) {
this.$el.html("Детали продукта " + id);
return this;
}
});
routes: {
"products/:id": "showProduct"
},
showProduct: function(id) {
var view = new ProductView({el: "#content"});
view.render(id);
}
Такое разделение маршрутизации и представлений обеспечивает чистую архитектуру и упрощает поддержку приложения.
Для SPA важно перехватывать клики по ссылкам, чтобы не перезагружать страницу:
$(document).on("click", "a[href^='/']", function(e) {
e.preventDefault();
var href = $(e.currentTarget).attr("href");
router.navigate(href, {trigger: true});
});
Это позволяет полностью контролировать навигацию через Backbone Router и поддерживать историю браузера.
navigate.Backbone.history.Backbone.js обеспечивает гибкий и мощный механизм маршрутизации, который подходит для построения сложных одностраничных приложений с глубокими ссылками, управлением историей и динамическим отображением контента.