#action #ngrx #store
Вопрос:
Я новичок в NgRx. Я сделал какой-то код, но результат не совсем такой, как предполагалось. Я хотел бы перехватывать каждое действие, отправляемое с dispatch()
помощью функции в магазин.
Мои цели заключаются в следующем:
- перехватывайте каждое действие, отправляемое в магазин, в пользовательском эффекте и распечатывайте текст (Перехватывающее действие…) на консоли без изменения действия. (Эффект, который обрабатывает это действие, должен работать нормально.)
- если действие (которое ранее было отправлено в магазин) выполнило свою работу (т. Е. Соответствующий редуктор внес изменения в магазин), я также хочу «отреагировать» на это и распечатать другое сообщение (Получено состояние из магазина.) на консоли.
У меня есть 2 проблемы в моем коде:
- тексты отображаются в неправильном порядке (т. Е. Сначала «Получено состояние из хранилища», затем «Перехватывающее действие…», затем снова «Получено состояние из хранилища»).
- чтобы перехватить каждое действие, я создаю массив всех действий, определенных в приложении, и вызываю
ofType()
этот массив. Если будет реализовано новое действие, мне придется вручную обновить этот массив. Есть ли способ получить зарегистрированные действия непосредственно из магазина ?
Ниже приведен код:
приложение.модуль.ts
//to register the Effect to intercept the actions imports: [ EffectsModule.forRoot([InterceptorEffects]), ]
приложение.компонент.ts
//here I react to the changes of the store _interceptorSubscription: Subscription; this._interceptorSubscription = _store.pipe(select((state, props) =gt; console.log("Got state from store.")) );
перехватчик.эффект.ts
//the Effect that should intercept every action @Injectable({ providedIn: "root" }) export class InterceptorEffects { private readonly _interceptAllAction$ = createEffect(() =gt; this._actions.pipe( ofType(...[JobActions.downloadResultAction, JobActions.deleteJobAction]), tap(() =gt; console.log("Intercepting action...")) ) , { dispatch: false } ); constructor(private _actions: Actions) {} }
Спасибо вам за любой совет.
Ответ №1:
Могу я спросить, зачем вам это нужно? Чтобы ответить на вопрос:
- АФАИК, ты не можешь этого сделать. Действие сначала достигает всех редукторов, а затем обрабатывается эффектами. Если вы хотите зарегистрировать действия ДО того, как они достигнут редуктора, взгляните на мета-редукторы.
- Чтобы реагировать на все действия в эффекте, не используйте
ofType
оператора, а просто подпишитесь на поток действий.
Комментарии:
1. Спасибо за подсказку. Я пытаюсь управлять пользовательской панелью загрузки; т. Е. (Начало действия)-gt;(Показать панель) соответственно. (Завершение действия)-gt;(Скрытая панель). Не все действия выполняют http-запрос. Должен ли я проверить состояние магазина, чтобы выполнить это ? Вы позволите мне задать еще 2 вопроса ?: 1) «…действия сначала достигают редукторов…»: означает ли это включение() соответствующего. запускается редуктор И вычисляется каждое соответствующее утверждение «выбрать (…)»? 2) в заявлении «createEffect(() =gt; this._actions.pipe(OfType(someAction), share()), { dispatch: false });» : какова цель указания как «поделиться ()», так и «отправить» ?
2. 1) да 2) вам не нужно делиться, отправлять, чтобы действие не отправлялось в магазин
3. Спасибо за ваш ответ.