ngrx/store 未显示表单的更新值

ngrx/store not showing the updated values of a form

我需要通过表单输入 2 个输入值,以兆字节(used_space 和 remaining_space)显示存储 space 的使用情况,并显示来自 ngrx/Store。每次提交表单时,都会显示新值并更新旧值。问题是 UI 始终显示默认值(used_space 和 remaining_space),我不知道我的体系结构是否正确,因为我是 ngrx/store 的新手。

型号(usage.model.ts):

   export interface Usage {
      used_space: number;
      remaining_space: number;
    }

操作(usage.actions.ts):

export const EDIT_USAGE  = '[Usage] Edit';
...
export class EditUsage implements Action {
  readonly type = EDIT_USAGE
  constructor(public payload: Usage) {}
}
...
export type All = Reset | EditUsage;

减速器(usage.reducer.ts): 导出类型 Action = UsageActions.All;

/// Default app state
const defaultState: Usage = {
  used_space: 2,
  remaining_space: 3
}

/// Helper function to create new state object
const newState = (state, newData) => {
  return Object.assign({}, state, newData)
}

export function usageReducer(state: Usage = defaultState, action: Action) {
  switch(action.type) {
    case UsageActions.EDIT_USAGE:
      // return [...state, action.payload];
      return newState(state, { Usage: action.payload });
    case UsageActions.RESET:
      return defaultState;
    default:
      return state;
  }
}

在app.component.ts中:

  usage: Observable<Usage>

  constructor(private store: Store<AppState>) {
    this.usage = this.store.select('usage')
  }

  editUsage(used_space,remaining_space) {
    this.store.dispatch(new UsageActions.EditUsage({used_space:used_space , remaining_space:remaining_space}) )
  }

在app.component.html中:

<input type="text"  #used_space>
<input type="text"  #remaining_space>
<button (click)="editUsage(used_space.value,remaining_space.value)" >Edit Space</button>

<div *ngIf="usage | async as u">
  <h2>Used space: {{ u.used_space }}</h2>
  <h2>remaining space: {{ u.remaining_space }}</h2>
</div>

我没有看到任何结果,我也不知道出了什么问题。

我认为是选择器的问题。

this.store.select('usage')

如果您的商店中有一个名为 usage 的对象,它将起作用。

例如:

const defaultState: AppState = {
  usage: {
    used_space: 2,
    remaining_space: 3
  }
}

所以你的代码应该是

// Default app state
const defaultState: AppState = {
  usage: {
    used_space: 2,
    remaining_space: 3
  }
}

export function usageReducer(state: AppState = defaultState, action: Action) {
  switch(action.type) {
    case UsageActions.EDIT_USAGE:
      return {
        ...state,
        usage: action.payload
      }

    case UsageActions.RESET:
      return defaultState;

    default:
      return state;
  }
}

问题出在你的reducer:

switch(action.type) {
  case UsageActions.EDIT_USAGE:
    return newState(state, { Usage: action.payload }); <<--------
}

您正在传递之前的状态和 new object with usage as a propertyObject.assign 所做的是:创建一个新对象,将以前的状态附加到它,附加一个全新的 属性 Usage 并向其添加新的存储值。这是新创建对象的视图:

你可以直接通过 payload 解决这个问题:

switch(action.type) {
  case UsageActions.EDIT_USAGE:
    return newState(state, action.payload);
}

Working Demo

此外,只要您在 reducer 中更新整个对象,我相信您也不需要 Object.assign()。您可以直接 return action.payload 因为它是新状态。