В приложениях на Polymer для организации навигации между различными
представлениями часто используется компонент app-route. Он
позволяет динамически управлять маршрутами и передавать параметры, что
особенно важно для построения одностраничных приложений (SPA).
Маршрут в Polymer состоит из трёх ключевых частей:
route — объект маршрута, получаемый от
app-location. Содержит информацию о текущем пути,
параметрах и подмаршрутах.pattern — шаблон, которому должен
соответствовать путь. Пример: /users/:userId.data — объект, куда автоматически
записываются значения параметров маршрута.Пример использования базового маршрута с параметром:
<app-location route="{{route}}"></app-location>
<app-route
route="{{route}}"
pattern="/users/:userId"
data="{{routeData}}"
tail="{{subroute}}">
</app-route>
<p>Текущий пользователь: [[routeData.userId]]</p>
В этом примере:
route связывается с app-location, который
отслеживает текущий URL.pattern определяет шаблон маршрута с параметром
:userId.routeData автоматически получает значение параметра из
URL. Если путь /users/42, то routeData.userId
будет равен "42".Для более сложной структуры приложения поддерживаются
вложенные маршруты. Используется атрибут
tail, который передаёт оставшуюся часть URL следующему
app-route.
Пример:
<app-route
route="{{route}}"
pattern="/users/:userId"
data="{{routeData}}"
tail="{{subroute}}">
</app-route>
<app-route
route="{{subroute}}"
pattern="/settings"
data="{{settingsData}}">
</app-route>
<p>Параметры пользователя: [[routeData.userId]]</p>
<p>Настройки: [[settingsData]]</p>
Если URL равен /users/42/settings, первый
app-route выделяет userId = 42, а второй
обрабатывает подмаршрут settings.
Для обработки ситуаций, когда параметры могут отсутствовать, применяется привязка с проверкой и дефолтным значением:
<p>Текущий пользователь: [[routeData.userId || 'не указан']]</p>
Таким образом, даже если параметр не передан в URL, приложение корректно отображает состояние.
Polymer позволяет изменять параметры маршрута без перезагрузки
страницы через объект route:
this.set('route.path', `/users/${newUserId}`);
После этого app-route автоматически обновит
routeData, и интерфейс отобразит новые данные.
При необходимости фильтровать или трансформировать параметры используется computed properties:
<p>Пользователь: [[_formatUserId(routeData.userId)]]</p>
...
_formatUserId(userId) {
return userId ? `ID: ${userId}` : 'не указан';
}
Это позволяет централизованно управлять представлением параметров маршрута.
app-route генерирует событие route-changed
при любом изменении маршрута. Его можно использовать для выполнения
дополнительных действий:
<app-route
route="{{route}}"
pattern="/users/:userId"
data="{{routeData}}"
on-route-changed="_onRouteChanged">
</app-route>
...
_onRouteChanged(e) {
console.log('Маршрут изменён', this.routeData.userId);
}
Это особенно полезно для подгрузки данных с сервера при переходе на новый маршрут.
Polymer поддерживает динамические сегменты маршрута через двоеточие
(:). Опциональные параметры обрабатываются через вложенные
маршруты или отдельные ветки шаблонов. Например:
<app-route
route="{{route}}"
pattern="/products/:productId(/:tab)?"
data="{{routeData}}">
</app-route>
В таком шаблоне productId обязателен, а tab
может отсутствовать. Это позволяет строить гибкие интерфейсы с
множеством представлений на одном маршруте.
Использование параметров маршрутов в Polymer сводится к трём шагам:
app-location с route.app-route с
параметрами.routeData для доступа к параметрам и
обновления интерфейса.Правильная организация маршрутов и параметров обеспечивает гибкость, динамичность и поддержку вложенной навигации в приложениях на Polymer.