#angular #angular-router
#angular #angular-маршрутизатор
Вопрос:
Возможно ли предоставить маршрутизатору global NavigationExtras
?
Я должен использовать skipLocationChange
всякий раз, когда я перехожу на другую страницу в своем приложении. В настоящее время я добавляю эту опцию либо в шаблон:
<a routerLink="settings" skipLocationChange>Settings</a>
или в компоненте:
this.router.navigate(['settings'], { skipLocationChange: true });
Могу ли я каким-то образом определить глобальные значения по умолчанию, NavigationExtras
которые автоматически добавляются ко всем navigate
действиям Angular, чтобы мне не приходилось добавлять их вручную к каждой ссылке в шаблоне или к каждому вызову router.navigate(..)
компонента?
Ответ №1:
Я боролся с этим в течение последнего часа. Фактически веб-приложение, над которым я работаю, запускается из нерегулярного браузера (на основе QT) в качестве надстройки.
И по какой-то причине, как только используется история местоположений, биты приложения перестают работать (без каких-либо ошибок).
Я дважды проверил, что все работает нормально, добавив «skipLocationChange» к одному из моих каналов маршрутизатора, и это сработало. Но я никак не мог бы сделать это во всем приложении, и, забыв только об одном из них, приложение автоматически сломалось бы, так что это слишком рискованно.
Сначала я подумал о расширении маршрутизатора и переопределил navigate
метод принудительной передачи skipLocationChange: true
. Но, опять же, это слишком рискованно… Существуют другие методы, которые не могут пройти через этот (один из примеров navigateByUrl
.
Итак, я подумал, почему бы полностью не отключить всю историю (по крайней мере, любую запись). Я покопался в исходном коде Angular и обнаружил, что то, что изменяет историю местоположений браузера, — это PushState
метод, определенный LocationStrategy
. Итак, единственное, что нам нужно сделать, чтобы полностью отключить запись в историю, — это определить класс, который расширяет одну стратегию (может быть либо PathLocationStrategy
, либо HashLocationStrategy
) и переопределить pushState
метод, чтобы сохранить его пустым:
class PathLocationStrategyWithoutHistoryState extends PathLocationStrategy {
override pushState( ): void {}
}
а затем в верхней части приложения в массиве providers введите его:
providers: [
{
provide: LocationStrategy,
useClass: PathLocationStrategyWithoutHistoryState
}
],