У меня есть приложение Angular 8 с ngrx. Я использую параметры пути и параметры запроса.
Если пользователь делает какой-либо конкретный выбор в веб-приложении (скажем, он выбирает определенный идентификатор), я выполняю router.navigate () и обновляю URL браузера с помощью идентификатора. Таким образом, состояние приложения и URL-адреса браузера синхронизированы.
С другой стороны, я слушаю
@Effect()
nav$ = this.actions$.pipe(
ofType(ROUTER_NAVIGATED),
...
switchMap(result => [
new SetIDInStore(id),
])
события навигации и обновляю хранилище. Таким образом, пользователь может сохранить глубокую ссылку со всеми своими настройками и выполнить ее позже. Если пользователь выполняет эту ссылку в браузере, все его настройки применяются в магазине. Итак, все синхронизировано: -)
Но теперь есть один случай, когда я получаю состояние гонки. Я мог бы решить это, если бы мог определить, было ли событие навигации инициировано пользователем, а не кодом. Примерно так:
@Effect()
nav$ = this.actions$.pipe(
ofType(ROUTER_NAVIGATED),
if (Event was triggered by user then update the store *1) {
dispatch ngrx event
}
else if (Event was triggered by router.navigate() ) {
do nothing
}
Кстати: я реализовал CustomSerializer.
* 1 = если он вводит URL-адрес в адресную строку браузера или изменяет его
-
Вкратце: мне нужно как-то разделить события: - пользователь изменил URL в адресной строке вручную - я выполнил router.navigation в своем коде, тогда мое решение будет работать.