在@angular redux/store-configureStore9版本中正确注册史诗



我已经将自己的项目从5版本移到了angular 6,@angular redux/store 9。一切都很好,但在中间件中注册史诗的方式不起作用。我从中间件中删除了除记录器之外的所有史诗,所有操作的执行都很好。然后我尝试添加一个史诗,并得到类似的错误

TypeError: action$.pipe is not a function
at SecurityUserEpics.loadSecurityUser (security-user.epic.ts:31)
at combineEpics.js:19

然后我试图解决这个问题,并搜索了许多关于的例子和文档,但找不到解决方案。在决定在这里提出问题后,在为问题准备代码的同时,找到了解决方案。Soo,我在这里发布这个解决方案,希望这能为某人节省时间。史诗:

loadSecurityUser = (action$) => {
debugger;
// here i have object of type : {getState: ƒ, dispatch: ƒ} and thats was pain from older version. pipe helps!
return action$.pipe(
ofType(SecurityUserActions.LoadSecurityUsers),
switchMap(q => this._dataSrv.getUserInfo()
.pipe(map(data => {
localStorage.setItem('isNeedRelogin', '0');
return this._securityUserActions.loadSecurityUserComplete(data);
}))));

}

最终配置存储:

const epicMiddleware = createEpicMiddleware();
const middleware = [epicMiddleware];
middleware.push(createLogger());
ngRedux.configureStore(combinedReducer, INITIAL_STATE, middleware, storeEnhancers);
const rootEpic = combineEpics(this._securityUserEpics.loadSecurityUser);
// this is new way of middleware registration
epicMiddleware.run(rootEpic);

使用provideStore代替configureStore,例如-

export const combinedEpics = combineEpics(
pingEpic,
fetchUserEpic
);
//replace ngRedux.configureStore with:
const epicMiddleware = createEpicMiddleware();
const store = createStore(
combinedReducer,
INITIAL_STATE,
applyMiddleware(createLogger(), epicMiddleware),
);
ngRedux.provideStore(store);
epicMiddleware.run(combinedEpics);

更多关于史诗的信息-https://redux-observable.js.org/docs/basics/Epics.html