代码之家  ›  专栏  ›  技术社区  ›  amit

从NGRX中的另一个reducer访问reducer状态

  •  0
  • amit  · 技术社区  · 7 年前

    这是一个非常类似的问题 this . NGRX是否提供了其他解决方案?

    0 回复  |  直到 7 年前
        1
  •  0
  •   joe_coolish    6 年前

    我只是在考虑做类似的事情时偶然发现了这个问题。我需要从另一个reducer复制一些状态信息作为临时的“编辑”数据集,可以取消并恢复到“记录”数据集。

    最后,我扩展了UI reducer(保存当前用户会话的状态/编辑的reducer)以包含一个属性来保存数据reducer(表示存储在数据库中的内容的reducer)中的数据副本。这些数据通过“启动”动作传入。

    import { Action } from "@ngrx/store";
    import {
      ICableFeature
    } from "../../shared/models";
    
    export enum UIActionTypes {
      ...
      UI_EDIT_CUSTOM_TAGS_START = "[UI] Edit Custom Tags Start",
      UI_EDIT_CUSTOM_TAGS_UPDATE = "[UI] Edit Custom Tags Update",
      UI_EDIT_CUSTOM_TAGS_SAVE = "[UI] Edit Custom Tags Save",
      UI_EDIT_CUSTOM_TAGS_SUCCESSFUL = "[UI] Edit Custom Tags Successful",
      UI_EDIT_CUSTOM_TAGS_FAILED = "[UI] Edit Custom Tags Failed",
      UI_EDIT_CUSTOM_TAGS_CANCELED = "[UI] Edit Custom Tags Canceled"
    }
    
    ...
    
    export class EditCustomTagsStart implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_START;
    
      constructor(public payload: ICableFeature) {}
    }
    
    export class EditCustomTagsUpdate implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_UPDATE;
    
      constructor(public payload: ICableFeature) {}  // This payload has a copy of the data I needed from the other reducer.  Make sure it is a copy and not the same object!
    }
    
    export class EditCustomTagsSave implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_SAVE;
    
      constructor() {}
    }
    
    export class EditCustomTagsSuccessful implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_SUCCESSFUL;
    
      constructor() {}
    }
    
    export class EditCustomTagsFailed implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_FAILED;
    
      constructor(public payload: string) {}
    }
    
    export class EditCustomTagsCanceled implements Action {
      readonly type = UIActionTypes.UI_EDIT_CUSTOM_TAGS_CANCELED;
    
      constructor() {}
    }
    
    export type UIActions =
      ...
      | EditCustomTagsStart
      | EditCustomTagsUpdate
      | EditCustomTagsSuccessful
      | EditCustomTagsFailed
      | EditCustomTagsCanceled;
    

    以下是我的UI reducer的缩写:

    import * as fromUI from "../actions/ui.actions";
    import {
      IOrchestratorState,
      IOrchestratorStatusState,
      ICableFeature
    } from "../../shared/models";
    export const uiFeatureKey = "ui";
    
    export interface State {
      showScroll: boolean;
      fillingGaps: boolean;
      fillGapStatus: IOrchestratorStatusState;
      currentFillGapState: IOrchestratorState;
      editingCustomTags: boolean;
      customTagEdits: ICableFeature;
    }
    
    export const initialState: State = {
      showScroll: true,
      fillingGaps: false,
      fillGapStatus: null,
      currentFillGapState: null,
      editingCustomTags: false,
      customTagEdits: null
    };
    
    export function reducer(state = initialState, action: fromUI.UIActions) {
      switch (action.type) {
        ...
        case fromUI.UIActionTypes.UI_EDIT_CUSTOM_TAGS_START:
          return {
            ...state,
            editingCustomTags: true,
            customTagEdits: action.payload  // This is a copy of the data I needed from the other reducer
          };
        case fromUI.UIActionTypes.UI_EDIT_CUSTOM_TAGS_UPDATE:
          return {
            ...state,
            customTagEdits: action.payload  // This is the updated information from user edits, not saved.  
                                            // I can also create a router guard that checks to makes sure the data in this 
                                            // property and the data in my Data store are the same before the page is deactivated
          };
        case fromUI.UIActionTypes.UI_EDIT_CUSTOM_TAGS_SUCCESSFUL:
        case fromUI.UIActionTypes.UI_EDIT_CUSTOM_TAGS_FAILED:
        case fromUI.UIActionTypes.UI_EDIT_CUSTOM_TAGS_CANCELED:
          return {
            ...state,
            editingCustomTags: false,
            customTagEdits: null
          };
    
        default:
          return state;
      }
    }
    

    我希望这有帮助!