Backbone.js предоставляет мощный инструмент для организации
клиентской навигации — Backbone.Router. Одной из ключевых
возможностей маршрутизатора является работа с глубокими
ссылками, что позволяет управлять состоянием приложения через
URL и поддерживать функциональность истории браузера.
Для обработки глубоких ссылок создается класс маршрутизатора:
var AppRouter = Backbone.Router.extend({
routes: {
"": "home",
"users": "listUsers",
"users/:id": "showUser",
"*path": "defaultRoute"
},
home: function() {
console.log("Главная страница");
},
listUsers: function() {
console.log("Список пользователей");
},
showUser: function(id) {
console.log("Пользователь с id:", id);
},
defaultRoute: function(path) {
console.log("Маршрут не найден:", path);
}
});
Ключевые моменты:
routes — объект, где ключи описывают URL-шаблоны, а
значения — методы роутера.:id) позволяют захватывать
параметры из URL.* используется для обработки всех
непредусмотренных маршрутов.Для корректной работы глубоких ссылок необходимо запускать
Backbone.history:
var router = new AppRouter();
Backbone.history.start({ pushState: true });
pushState: true включает использование HTML5
History API, что позволяет работать с красивыми URL без
#.pushState, Backbone
автоматически использует хэш-маршруты (#).Для реализации внутренней навигации по ссылкам нужно предотвращать стандартное поведение браузера:
$(document).on("click", "a[data-nav]", function(e) {
e.preventDefault();
var href = $(this).attr("href");
router.navigate(href, { trigger: true });
});
data-nav маркирует ссылки для внутренней
маршрутизации.router.navigate обновляет URL и вызывает
соответствующий маршрут.trigger: true гарантирует вызов обработчика
маршрута.Backbone.js не предоставляет встроенной поддержки query-параметров, поэтому их можно обрабатывать вручную:
var parseQueryString = function(query) {
var params = {};
query.replace(/^\?/, '').split('&').forEach(function(pair) {
var parts = pair.split('=');
params[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1] || '');
});
return params;
};
var AppRouter = Backbone.Router.extend({
routes: {
"search?:query": "search"
},
search: function(query) {
var params = parseQueryString(query);
console.log("Параметры поиска:", params);
}
});
search?:query позволяет захватывать все
query-параметры.parseQueryString преобразует строку запроса в
объект для удобного использования.Для работы с глубокими ссылками на сервере необходимо настроить поддержку роутов на стороне сервера. Любой URL, обрабатываемый Backbone, должен возвращать основной HTML страницы, чтобы клиентский роутер мог корректно отработать:
GET /users/42 -> возвращает index.html
GET /users -> возвращает index.html
Backbone позволяет добавлять маршруты динамически:
router.route("projects/:projectId/tasks/:taskId", "taskDetail", function(projectId, taskId) {
console.log("Задача", taskId, "в проекте", projectId);
});
router.route используется для добавления новых
маршрутов после инициализации.Backbone автоматически синхронизирует состояние маршрутов с кнопками браузера:
Backbone.history.start();
pushState обеспечивает корректное
поведение при переходе по истории.router.on("route:showUser", function(id) {
console.log("Переход к пользователю с id:", id);
});
Маршруты Backbone могут взаимодействовать с Views и Collections:
var UserView = Backbone.View.extend({
render: function(user) {
this.$el.html("Имя пользователя: " + user.get("name"));
return this;
}
});
var AppRouter = Backbone.Router.extend({
routes: {
"users/:id": "showUser"
},
showUser: function(id) {
var user = usersCollection.get(id);
var view = new UserView({ el: "#user-container" });
view.render(user);
}
});
router.navigate.pushState.Глубокие ссылки в Backbone.js обеспечивают стабильную навигацию, позволяют поддерживать состояние приложения через URL и интегрируются с коллекциями, моделями и представлениями, создавая единый механизм маршрутизации для SPA.