Повторное использование вкладки: маршрутизация с сохранением данных
Повторное использование вкладок — это распространённая практика в серверных системах, которая решает проблему потери данных при переключении между маршрутами.
При повторном использовании текущая страница всегда остаётся открытой, а данные всех компонентов сохраняются. Когда пользователь возвращается на ту же страницу, данные извлекаются из кэша.
Как использовать?
Установите пакет:
npm install --save reuse-tab
По умолчанию модуль AdReuseTabModule
не регистрирует RouteReuseStrategy
. Помимо импорта модуля, необходимо вручную зарегистрировать RouteReuseStrategy
:
// delon.module.ts или app.module.ts
providers: [
{
provide: RouteReuseStrategy,
useClass: ReuseTabStrategy,
deps: [ReuseTabService],
},
ReuseTabService
]
Режим соответствия
В любом месте проекта (рекомендуется в startup.service.ts
) можно внедрить класс ReuseTabService
и установить свойство mode
, либо повторно задать значение с помощью <reuse-tab [mode]="0"></reuse-tab>
. Доступны следующие режимы:
0 (по умолчанию):
{ text:'Dashboard' }
и { text:'Dashboard', reuse: true }
.{ text:'Dashboard', reuse: false }
.1 (рекомендуется):
{ text:'Dashboard', reuse: true }
.{ text:'Dashboard' }
и { text:'Dashboard', reuse: false }
.2 (URL): действует для всех маршрутов, можно комбинировать с excludes
для фильтрации маршрутов без повторного использования.
Если в конфигурации маршрута есть атрибут data
, который содержит значение reuse
, то оно имеет приоритет над вышеуказанными правилами.
Текст метки
Текст метки получается в следующем порядке:
ReuseTabService.title = 'new title'
внутри компонента для переопределения текста.data
в конфигурации маршрута, содержащий reuseTitle
, если он присутствует, используется вместо title
.text
в данных меню.Пример кода для ReuseTabService
:
export class DemoReuseTabEditComponent implements OnInit {
id: any;
constructor(private route: ActivatedRoute, private reuseTabService: ReuseTabService) {}
ngOnInit(): void {
this.route.params.subscribe(params => {
this.id = params.id;
this.reuseTabService.title = `Редактировать ${this.id}`;
});
}
}
Жизненный цикл
Процесс повторного использования маршрута не вызывает никаких хуков жизненного цикла (например, ngOnInit
), но часто требуется обновить данные во время повторного использования, поэтому reuse-tab
предоставляет два новых хука жизненного цикла для временного решения этой проблемы.
onReuseInit()
вызывается, когда текущий маршрут находится в процессе повторного использования.
onReuseDestroy()
вызывается, когда текущему маршруту разрешено повторное использование и происходит переход на новый маршрут.
С префиксом _
(ожидается, что Angular предоставит соответствующие хуки в будущем), простой пример:
@Component()
export class DemoComponent {
_onReuseInit() {
console.log('_onReuseInit');
}
_onReuseDestroy() {
console.log('_onReuseDestroy');
}
}
Частые вопросы
Как отлаживать?
Повторное использование маршрута сохраняет состояние компонентов, что может привести к другим проблемам. В большинстве случаев компоненты работают нормально, но следует учитывать следующее:
OnDestroy
может обрабатывать некоторые внешние стили компонентов (например, для body
), что можно решить с помощью хуков жизненного цикла.debug
консоль будет содержать много информации, полезной для анализа процесса повторного использования маршрутов.API
Интерфейс ReuseTabService
имеет следующие свойства и методы:
Параметр | Описание | Тип | Значение по умолчанию |
---|---|---|---|
[mode] |
Устанавливает режим соответствия | ReuseTabMatchMode |
0 |
[debug] |
Включает режим отладки | boolean |
false |
[excludes] |
Исключения для режима mode=URL
|
RegExp[] |
- |
[items] |
Получает кэшированные маршруты | ReuseTabCached[] |
- |
[count] |
Получает общее количество кэшированных маршрутов | number |
- |
[change] |
Подписывается на уведомления об изменениях в кэше | Observable<ReuseTabNotify> |
- |
[title] |
Настраивает текущий заголовок | string |
- |
[closable] |
Настраивает текущее состояние закрытия | boolean |
- |
Методы:
Метод | Описание | Возвращаемый тип |
---|---|---|
index(url) |
Получает позицию кэширования для указанного пути, -1 означает отсутствие кэширования |
number |
exists(url) |
Проверяет наличие кэшированного маршрута | boolean |
get(url) |
Получает указанный путь из кэша | boolean |
getTitle(url, route?: ActivatedRouteSnapshot) |
Получает заголовок | string |
clearTitleCached() |
Очищает данные пользовательского заголовка | void |
getClosable(url, route?: ActivatedRouteSnapshot) |
Получает состояние closable
|
string |
clearClosableCached() |
Очистка кэша состояния closable
|
void |
remove(url) |
Удаляет маршрут по URL, также запускает событие change remove |
void |
move(url, position) |
Перемещает данные кэша, также запускает событие change move |
void |
clear() |
Очищает все кэши, также запускает событие change clear |
void |
refresh() |
Не выполняет никаких действий, но запускает событие change refresh |
void |
replace(url) |
Принудительно закрывает текущий маршрут (включая те, которые нельзя закрыть) и перенаправляет на newUrl
|
void |
Компонент reuse-tab
:
Параметр | Описание | Тип | Значение по умолчанию |
---|---|---|---|
[mode] |
Устанавливает режим соответствия | ReuseTabMatchMode |
0 |
[debug] |
Включает режим отладки | boolean |
false |
[max] |
Разрешает повторное использование до max страниц |
number |
10 |
[excludes] |
Исключения для режима mode=URL
|
RegExp[] |
- |
[allowClose] |
Позволяет закрывать | boolean |
true |
[showCurrent] |
Всегда показывает текущую страницу | boolean |
true |
[fixed] |
Фиксированный режим | boolean |
true |
(close) |
Обратный вызов закрытия | EventEmitter |
- |
(change) |
Обратные вызовы при изменении, принимают как минимум active и list параметров |
EventEmitter |
- |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )