ActivatedRoute.queryParams не определен после обновления экрана в Angular 5

Пожалуйста помоги!

Итак, у меня есть следующий URL

https://xxx.io/#/route1/yyyyyyyy?tj=3&bd=7

И когда я перехожу к нему, у меня появляется следующий код:

this.route.queryParams.subscribe((res: any) => {
        console.info('tj: ' + res.tj)
        console.info('bd: ' + res.bd)

Теперь это печатает то, что я ожидал, а именно tj: 3 и bd: 7.

Но когда я обновляю экран, res.tj и res.bd не определены. Как это может быть?

Первоначально это происходило, потому что я заметил, что URL-адрес, когда я обновил экран, изменился на:

https://xxx.io/#/route1/yyyyyyyy%3D3&bd%3D7

Но это было из-за проблем с кодировкой URL-адресов, поэтому я добавил CustomUrlSerializer, например:

import { UrlSerializer, UrlTree, DefaultUrlSerializer } from '@angular/router';

export class CustomUrlSerializer implements UrlSerializer {

  parse(url: string): UrlTree {
    const dus = new DefaultUrlSerializer();
    return dus.parse(url);
  }

  serialize(tree: UrlTree): any {
      const dus = new DefaultUrlSerializer();
      let path = dus.serialize(tree);
      return path.replace("%3F", "?").replace(/%3D/g, " = ");
  }
}

И это устранило эту проблему, поэтому URL-адрес снова верен после обновления:

https://xxx.io/#/route1/yyyyyyyy?tj=3&bd=7

Но res.tj и ts.bd все еще не определены !!!

Застряли на этом в течение нескольких часов, поэтому надеемся, что кто-то сможет пролить свет на то, почему это происходит и как я могу это исправить?

Спасибо!

Как изменить URL-адрес? По Routernavigate?

Buczkowski 18.10.2018 21:48

Да, а затем передайте параметры запроса в качестве дополнительных элементов навигации ...

user1974753 18.10.2018 22:00

Это может быть глупый вопрос (не очень знаком с маршрутизацией Angular), но откуда эта часть URL-адреса # / anchor? Мне кажется очень странным, чтобы параметры запроса были после хэштегом в URL-адресе. Можете ли вы опубликовать пример того, как вы генерируете эти URL-адреса и как определяются ваши маршруты?

Jeto 18.10.2018 22:07

Знак # здесь из-за HashLocationStrategy, которую я использую. Не думайте, что это проблема, поскольку маршрут успешно имеет параметры запроса, когда я перехожу к этому URL-адресу в первый раз, но затем при обновлении он не определен ...

user1974753 18.10.2018 22:18

Можете ли вы предоставить образец кода при вызове navigate?

Buczkowski 18.10.2018 22:30

ты можешь попробовать? preserveQueryParams: true; читайте здесь: angular.io/api/router/NavigationExtras

Aragorn 18.10.2018 23:13

@Vivek Ага, это сработало, большое спасибо!

user1974753 18.10.2018 23:39

@Buczkowski благодарит за помощь.

user1974753 18.10.2018 23:41

@Jeto спасибо за помощь.

user1974753 18.10.2018 23:41

@ user1974753 хорошо, я добавлю это в качестве ответа, возможно, кому-то еще будет проще искать.

Aragorn 19.10.2018 17:02
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
10
805
1

Ответы 1

Интерфейс Angular Навигация имеет свойство preserveQueryParams, установка его на true может помочь в вашем случае

Типичное использование:

this.router.navigate(['/view'], { preserveQueryParams: true });

Другие вопросы по теме