Используя Angular и ngrx, я хочу перейти к маршруту и убедиться, что необходимые данные доступны в ngrx / store. Я использую действие / эффект / редуктор ngrx / store для физического вызова API. Компонент, который загружает маршрут, обращается к данным через хранилище, так как другие части системы могут обновлять данные.
Если данные не загружаются, отправляется действие LOAD_FAILED, которое может быть обработано различными способами.
Должен ли я использовать охрану или распознаватель? Каковы некоторые другие плюсы и минусы каждого подхода? Что вы пробовали, и если бы у вас было время снова, вы бы сделали это так же? Ниже приведены некоторые из моих мыслей.
Вариант 1: Охрана
При доступе к маршруту canActivate охранника проверяет, есть ли данные в хранилище, а если нет, загружает их из API и добавляет их в хранилище. Если данные не загружаются, canActivate возвращает false (как наблюдаемое).
У этого подхода есть обратная сторона: «загрузка данных не должна быть обязанностью охранника», но есть и проблема предотвращения доступа, если данные не могут быть загружены, и маршрутизатор может обработать переход к «не найден», оба из которых находятся в пределах ответственности.
Вариант 2: резольвер
При доступе к маршруту и разрешению активации любых других охранников вызывается распознаватель. Этот распознаватель проверяет, находятся ли данные в хранилище, и, если нет, запускает действие LOAD, чтобы загрузить из API и добавить в хранилище. Затем, как только данные были загружены, распознаватель возвращает некоторые произвольные данные, которые отбрасываются маршрутом / компонентом, поскольку компонент использует хранилище. Если данные не загружаются, что-то будет перенаправлено на не найденную страницу
У этого подхода есть и обратная сторона: распознаватель не используется в традиционном смысле, например данные, которые он возвращает, отбрасываются. Кроме того, либо преобразователь должен перенаправить на 404, когда не найден, или LOAD_FAILED необходимо перенаправить. Это добавляет сложности, поскольку могут быть случаи, когда LOAD_FAILED не должен перенаправлять, например, когда фоновое действие запускает загрузку. С другой стороны, за загрузку данных отвечает распознаватель.