NgrX 效果重定向 angular

NgrX effect redirect angular

我有这样的效果

  createAssignment$ = createEffect(() =>
    this.action$.pipe(
      ofType(AssignmentActions.createAssignment),
      switchMap((action) =>
        this.assignmentService.createNewAssignment(action.assignmentTo).pipe(
          map((data) => AssignmentActions.createAssignmentSuccess({ createdAssignment: data }),
            catchError((error) => of(error))),
        )
      )
    ));

我需要的是根据数据中的值将用户重定向到新页面,就像这样

 this.router.navigate(data);

但是不知道什么时候做,是做新的效果还是刚做的?有人遇到过类似的问题吗?

您可以在 map 之后使用 tap 运算符来完成此操作,只有在操作成功时才​​会调用该运算符:

createAssignment$ = createEffect(() =>
    this.action$.pipe(
        ofType(AssignmentActions.createAssignment),
        switchMap((action) =>
            this.assignmentService
                .createNewAssignment(action.assignmentTo)
                .pipe(catchError((error) => of(error)))
        ),
        map((data) => AssignmentActions.createAssignmentSuccess({ createdAssignment: data })),
        tap((data) => { this.router.navigate(data); })
    )
);

我建议为重定向创建单独的效果。 New Effect 封装了自己的逻辑并使其也可重用。监听多个有效的动作应该是常见的模式。

  1. 在你的效果器中注入路由器 class assignemnts.effects.ts

    构造函数( ... 私有只读路由器:路由器){}

  2. 你的代码

监听您的 AssignmnetActions.CreateAssignemntSuccess({assignment}); 的重定向效果 场景:它将获取分配中用户的 ID 并重定向到 /user-details 页面。

userPageRedirect$ = createEffect(() =>
    this.actions$.pipe(
      ofType(AssignmnetActions.CreateAssignemntSuccess()),
      concatMap((action) => of(action).pipe(withLatestFrom(this.store.pipe(select(getSelectedUserId))))),
      fetch({
        run: (action, userId: number) => {
          this.router.navigate([`/user-details/${userId}`]);
        },
      })
    ));