Изучаем runGuardsAndResolvers в Angular Router

`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
(onlyv7.1+
)pathParamsOrQueryParamsChange
(onlyv7.2+
)- можно использовать собственную функцию(only
v7.2+
)
Когда это может пригодится?
Основной вариант использования такого режима — обновление пользовательского интерфейса и синхронизация URL-адреса с локальными изменениями. Например, при отображении сортируемой таблицы изменение направления сортировки часто выполняется самой таблицей. Но вы бы хотели обновить URL-адрес, чтобы он синхронизировался с тем, что отображается пользователю. Пока направление сортировки таблицы сохраняется как параметр матрицы, вы можете использовать эту опцию для обновления URL-адреса, не вызывая накладных расходов на повторный запуск средств защиты и преобразователей.