【问题标题】:updateOne of ngrx entity is not changing the stateupdateOne 的 ngrx 实体没有改变状态
【发布时间】:2020-06-07 08:38:02
【问题描述】:

我的动作设置是这样的

    export const bankAccountUpdating = createAction(
  '[Create New Account Component] Account Updating',
  props<{ update: Update<BankAccount> }>()
);

export const bankAccountUpdated = createAction(
  '[Bank Manager Effect] Account Updated',
  props<{ update: Update<BankAccount> }>()
);

export const updateAccountError = createAction(
  '[Bank Manager Effect] Update Accounts Error'
);

减速器是这样设置的

 export const initialBankAccountsState = adapter.getInitialState({
  allBankAccountsLoaded: false,
});

export const bankManagerReducer = createReducer(
  initialBankAccountsState,

  on(BankManagerActions.bankAccountUpdated, (state, action) =>
    adapter.updateOne(action.update, state)
  ),

我有一个触发“更新”的效果,一旦服务器的响应返回,我就会调度“更新”

 updateAccount$ = createEffect(() =>
  this.actions$.pipe(
    ofType(BankManagerActions.bankAccountUpdating),
    concatMap((action) =>
      this.bankManagerHttpService
        .updateAccount(action.update.id, action.update.changes)
        .pipe(
          map(account => BankManagerActions.bankAccountUpdated(
            {update: {id: account.id, changes: account}})), // action here
          catchError((err) => {
            console.log(err);

            return of(BankManagerActions.updateAccountError());
          })
        )
    ),
));

请注意,在“更新”上,我正在执行“adapter.updateOne”,但商店没有显示任何差异。 请注意,在“更新”时我没有减速器逻辑,因为我没有改变状态。 “更新”只会导致进行后端调用的效果。当我从后端返回时,我调用“updated”,它调用“updateOne”,但它不会改变状态。

当我加载具有网格的页面并加载所有帐户时,我看到出现了差异。数组中的一个对象已更新。 一旦我调用“updateOne”,它应该会显示出差异

更新

服务代码如下所示

    updateAccount(id: string | number, account: Partial<BankAccount>): Observable<BankAccount> {
    const headers = new HttpHeaders();
    headers.append('Content-Type' , 'application/json');
    return this.http.put<BankAccount>('https://localhost:44391/BankAccount/' + id, account);
  }

【问题讨论】:

  • 您确定this.bankManagerHttpService.updateAccount 返回Observable&lt;Account&gt; 吗?如果不是这种情况,请尝试:BankManagerActions.bankAccountUpdated({update: action.update})bankAccountUpdatedaction的内容是什么?
  • 是的,这是问题所在,现在可以了。您可以将此添加为答案

标签: angular rxjs ngrx ngrx-effects ngrx-entity


【解决方案1】:

如果bankManagerHttpService.updateAccount 没有返回Observable&lt;Account&gt;,请尝试:BankManagerActions.bankAccountUpdated({update: action.update})

【讨论】:

  • 在添加的代码中你可以看到它确实返回了 observable 但仍然是你所说的工作
  • 您可以使用this.http.put&lt;Whatever&gt;(...) 使http 在前端返回您想要的任何类型,但这并不意味着后端在运行时返回此类型。在你的位置,我会检查后端是否真的返回一个帐户(例如:使用 Chrome Devtool ==> 网络)...,如果不是这样,它将更新方法的签名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2021-12-06
  • 2020-02-12
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多