Angular 如何动态注册ngrx效果?

Angular 如何动态注册ngrx效果?,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,快速 我正在尝试动态创建ngrx效果 我正在努力实现的目标: @Injectable() export class DispatchHandlerProcessor<STORE_STATE> { actions$: Observable<Action>[] = []; constructor( private _store: Store<STORE_STATE>, private _dispatchedActions: Action

快速

我正在尝试动态创建ngrx效果

我正在努力实现的目标:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  actions$: Observable<Action>[] = [];

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const postActionProcessor$: Observable<Action>
      = this._dispatchedActions.pipe(
        ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
        tap((action: SUCC | FAIL) => {
          handler.processPostAction(action); // method executed after LOAD_DOCUMENT
      })
    );
    this.actions$.push(postActionProcessor$);
    this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
  }

}
我希望能够在我的ngrx存储中调度操作,然后能够决定当操作成功或失败时该做什么

我现在是怎么做的:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  actions$: Observable<Action>[] = [];

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const postActionProcessor$: Observable<Action>
      = this._dispatchedActions.pipe(
        ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
        tap((action: SUCC | FAIL) => {
          handler.processPostAction(action); // method executed after LOAD_DOCUMENT
      })
    );
    this.actions$.push(postActionProcessor$);
    this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
  }

}
我的商店里有3个动作<代码>加载文档,
加载文档成功
加载文档失败
。现在,我正试图从监听
LOAD\u DOCUMENT\u SUCCESS
LOAD\u DOCUMENT\u FAILURE
操作创建一个
可观察的
。当其中一个被调度时,它将调用
processPostAction()
方法。一旦可观察对象准备好,我调用
LOAD\u文档
操作

这是我的实现:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  actions$: Observable<Action>[] = [];

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const postActionProcessor$: Observable<Action>
      = this._dispatchedActions.pipe(
        ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
        tap((action: SUCC | FAIL) => {
          handler.processPostAction(action); // method executed after LOAD_DOCUMENT
      })
    );
    this.actions$.push(postActionProcessor$);
    this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
  }

}
@Injectable()
导出类DispatchHandlerProcessor{
行动$:可观察)

我的问题:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  actions$: Observable<Action>[] = [];

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const postActionProcessor$: Observable<Action>
      = this._dispatchedActions.pipe(
        ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
        tap((action: SUCC | FAIL) => {
          handler.processPostAction(action); // method executed after LOAD_DOCUMENT
      })
    );
    this.actions$.push(postActionProcessor$);
    this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
  }

}
如何动态注册我的效果?有没有更好的方法来实现我尝试实现的模式

小提示:操作阵列将增长并产生内存问题。目前,这只是一个小技巧,可以让它正常工作。理想情况下,我希望注册效果,而不是使用此阵列

我还意识到
@Effect
关键字没有放在任何地方。我有一个错误
当把它放在第12行时,装饰器在这里无效


我“正常”创建的所有效果都运行得很好。

实际上,我通过订阅
操作解决了这个问题

代码如下:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const subscription: Subscription = this._dispatchedActions.subscribe(action => {
      if(action.type == handler.successType || action.type == handler.failureType) {
        handler.processPostAction(<SUCC | FAIL>action);
        subscription.unsubscribe();
      }
    });
    this._store.dispatch(handler.actionToDispatch);
  }
}
@Injectable()
导出类DispatchHandlerProcessor{
建造师(
私人商店:商店,
私有调度操作:操作
) { } 
流程(处理程序:DispatchHandler):无效{
const subscription:subscription=this.\u dispatchedActions.subscription(action=>{
if(action.type==handler.successType | | action.type==handler.failureType){
handler.processPostAction(action);
订阅。取消订阅();
}
});
此._store.dispatch(handler.actionToDispatch);
}
}

如果有人知道答案,我仍然对如何动态注册
@Effect
感兴趣!

我感兴趣的是这样做,在同一页面中的多个angular micro应用程序之间共享一个存储。你找到动态注册效果的方法了吗?嗨,manu,没有,我没有找到这样做的方法。我们结束我开始用上面的解决方案。