Вы можете использовать Meta Reducer: https://www.ngxs.io/advanced/meta-reducer
import { getActionTypeFromInstance } from '@ngxs/store';
export function extendApplicationPlugin(state, action, next) {
// Use the get action type helper to determine the type
if (getActionTypeFromInstance(action) !== LogoutUser.type) {
// do timer stuff...
}
// return the next function with the next state
return next(state, action);
}
Вы бы подключили его так:
import { NgModule } from '@angular/core';
import { NGXS_PLUGINS } from '@ngxs/store';
@NgModule({
imports: [NgxsModule.forRoot([])],
providers: [
{
provide: NGXS_PLUGINS,
useValue: extendApplicationPlugin,
multi: true
}
]
})
export class AppModule {}
У вас не будет сделать это таким образом. Вы также можете использовать getActionTypeFromInstance(action)
в своем собственном плагине.
Если вам нужно отправить событие, вам нужно будет использовать useFactory
с deps
и ввести Store
или использовать инжектор, чтобы получить ссылка на Store
.
Не проверял это, и я не знаю, будет ли это работать, надеюсь, это подтолкнет вас в правильном направлении:
import { NgModule } from '@angular/core';
import { NGXS_PLUGINS, Store } from '@ngxs/store';
@NgModule({
imports: [NgxsModule.forRoot([])],
providers: [
{
provide: NGXS_PLUGINS,
useFactory: extendApplicationPlugin,
deps: [Store],
multi: true,
}
]
})
export class AppModule {}
Реализация
import { getActionTypeFromInstance, Store } from '@ngxs/store';
export function extendApplicationPlugin(store: Store) {
return function extendApplicationPlugin(state, action, next) {
// Use the get action type helper to determine the type
if (getActionTypeFromInstance(action) !== LogoutUser.type) {
// do timer stuff...
// store.dispatch()
}
// return the next function with the next state
return next(state, action);
}
}