Изучаем runGuardsAndResolvers в Angular Router

Alexander Bukhtatyy
3 min readAug 15, 2020

--

Оригинал

`runGuardsAndResolvers` позволяет вам контролировать когда маршрутизатор будет выполненять ресолверы(resolvers) и гарды(guards).

Изучим как мы можем использовать новую возможность настройки runGuardsAndResolvers для конфигурации роутов в Angular , что бы лучше управлять запуском ресолверов и гардов.

Я уверен вы знаете о ресолверах и гардах в роутере и для чего они используются. Если не знаете не беспокойтесь. У автора ориганала есть полный курс на эту тему.

Возможность runGuardsAndResolvers (офф дока) на самом деле довольно скрытая функциональность и мало используется. Тем не менее он был в Angular c 4ой версии. Возможности в то время были довольно ограничеными, примерно такими:

Изначально было 3 свойства: always, paramsOrQueryParamsChange и paramsChange. Учитывая конфигурацию роутера, мы можем установитьсвойство runGuardsAndResolvers в одно из двух значений.

По умолчанию если вы не выбирали режим работы, роутер применит режим paramsChange, означающий что роутер перезапустит резолверы и гарды когда изменится путь или параметры пути. Примеры URL удовлетворяющие его условию и запускающие гарды и ресолверы:

  • /home/1 => /home/2
  • /home/1 => /home/1;param1=38
  • /home/1;param1=38 => /home/1;param1=20

Примеры не запускающие изменения

  • /home/1 => /home/1?queryParam=hi

С другой стороны, при установке paramsOrQueryParamsChange охранники и резолверы срабатывают при большинстве изменений URL-адреса и очень похожи на параметр always (единственная разница, вероятно, заключается в изменении фрагмента URL-адреса):

  • /home/1 => /home/2
  • /home/1 => /home/1;param1=38
  • /home/1;param1=38 => /home/1;param1=20
  • /home/1 => /home/1?queryParam=hi

Как следует из названия, он запускается тогда когда параметры или параметры запросы были изменены.

Basically as the name suggests, it fires whenever the params (i.e. ;param1=..) changes or a query param (i.e. ?someQuery=..). One might not guess, but it also changes for al modifications of the path, like in the very first example when moving from /home/1 to /home/2. Возможно не очевидно но он так же запускает процесс при всех модификациях пути, как в самом первом примере.

Новая модель в Angular 7.1 и 7.2

В Angular 7 было введено пара новых опций для runGuardsAndResolvers. Первая была введена в 7.1 — pathParamsChange.

Когда применяем pathParamsChange, роутер будет перезапускать гарды и ресолверы только тогда когда параметры пути были изменены, игнорируя опциональные параметры и параметры запроса.

В результате толко следующий маршрут запустит цикл

  • /home/1 => /home/2

Изменения ниже не запустят цикл

  • /home/1 => /home/1;param1=38
  • /home/1;param1=38 => /home/1;param1=20
  • /home/1 => /home/1?queryParam=hi

В Angular 7.2 был добавлен другой вариант, называемый pathParamsOrQueryParamsChange. Это опция похожа на pathParamsChange, но еще берет во внимание параметры запроса.

Гарды и ресолверы будут запущены для следующих роутов:

  • /home/1 => /home/2
  • /home/1 => /home/1?queryParam=hi

Однако они не будут срабатывать при следующих изменениях URL:

  • /home/1;param1=38 => /home/1;param1=20

Если вам нужна еще большая гибкость, теперь даже можно передать функцию runGuardsAndResolvers, которая будет вызываться платформой, передавая текущий и будущий ActivatedRouteSnapshot. Это дает вам полную гибкость для проверки текущего состояния маршрутизатора и принятия соответствующего решения.

Running Stackblitz

Ссылка на stackblitz что бы вы могли поиграться с параметрами

Заключение

В соедующий раз когда вы захотите больше контроля над вашими ресолверами и гардами, вы знаете что в вашем распоряжении имеются несколько опций:

  • paramsChange (default)
  • paramsOrQueryParamsChange
  • always
  • pathParamsChange (only v7.1+)
  • pathParamsOrQueryParamsChange (only v7.2+)
  • можно использовать собственную функцию(only v7.2+)

Когда это может пригодится?

Основной вариант использования такого режима — обновление пользовательского интерфейса и синхронизация URL-адреса с локальными изменениями. Например, при отображении сортируемой таблицы изменение направления сортировки часто выполняется самой таблицей. Но вы бы хотели обновить URL-адрес, чтобы он синхронизировался с тем, что отображается пользователю. Пока направление сортировки таблицы сохраняется как параметр матрицы, вы можете использовать эту опцию для обновления URL-адреса, не вызывая накладных расходов на повторный запуск средств защиты и преобразователей.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response