Добавьте глобальные навигационные строки к каждому действию навигации маршрутизатора

#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
  }
],