angular - NgRx - 从后端获取错误验证并传递给组件

标签 angular ngrx ngrx-store ngrx-effects

我试图从 api 中获取错误消息并显示在我的表单输入中,以便用户可以看到正在提交的数据有什么问题。

来自 API 的响应:

{
  "message": "The given data was invalid.",
  "errors": {
    "name": [
      "This name is already in use."
    ]
  }
}

用户表单.component.ts

this.store.dispatch(new actions.CreateUser(user));

用户效果.ts

@Effect()
  CreateUser$: Observable<Action> = this.actions$.pipe(
    ofType(UserActions.CREATE_USER),
    map((action: UserActions.CreateUser) => action.payload),
    switchMap(payload => {
      return this.userService.save(payload).pipe(
        map((user: User) => {
          return new UserActions.CreateUserSuccess(user);
        }),
        catchError(err => {
          return of(new UserActions.CreateUserFail());
        })
      );
    })
  );

我如何获取该错误并将其传回我的组件?

我是否应该喜欢效果内部并将其订阅到等待 CreateUserFail 错误的操作?我不确定这是否是一个好的做法,因为它会监听所有类型的 Action。

最佳答案

我们构建了一个选择器并订阅了该选择器。

效果

  @Effect()
  createProduct$: Observable<Action> = this.actions$.pipe(
    ofType(productActions.ProductActionTypes.CreateProduct),
    map((action: productActions.CreateProduct) => action.payload),
    mergeMap((product: Product) =>
      this.productService.createProduct(product).pipe(
        map(newProduct => (new productActions.CreateProductSuccess(newProduct))),
        catchError(err => of(new productActions.CreateProductFail(err)))
      )
    )
  );

reducer

case ProductActionTypes.CreateProductFail:
  return {
    ...state,
    error: action.payload
  };

选择器

export const getError = createSelector(
  getProductFeatureState,
  state => state.error
);

组件

// Watch for changes to the error message
this.errorMessage$ = this.store.pipe(select(fromProduct.getError));

模板

<div *ngIf="errorMessage$ | async as errorMessage" class="alert alert-danger">
  Error: {{ errorMessage }}
</div>

您可以在此处找到完整示例:https://github.com/DeborahK/Angular-NgRx-GettingStarted/tree/master/APM-Demo4

关于angular - NgRx - 从后端获取错误验证并传递给组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830947/

相关文章:

angular - 如何在 StoryBook 和 Angular 测试中设置 NGRX Store 的状态?

rxjs - Observable 不发出任何值

angular - 关于从 NgRx 存储中选择数据的问题

css - 如何在Angular2中调整YouTubePlayer的高度

javascript - 如何在 Angular 中用当前时间减去 firebase 时间戳并检查它是否超过 5 分钟

angular - 不要从 Angular 表单发送值

Angular 5 到 6 升级 : Property 'map' does not exist on type Observable

Angular/ngrx - 对状态值进行分组和聚合

angular - 将大 reducer 拆分为更小的 reducer

angular8 - Angular Ngrx商店测试 `The feature name "storeOne“在该状态下不存在`