angular - 使用 Angular 和 ngRx 显示微调器和加载事件

标签 angular redux ngrx

我正在使用 ngRx 开发 Angular 应用程序并尝试实践其最佳实践。但我发现我找不到如何正确进行的地方,那就是在异步操作发生时处理它们,并向用户提供适当的反馈!

提供用户反馈并防止他点击发送按钮两次是非常好的,但是,同样,我不清楚如何使用 Angular 和 ngrx 以良好的方式做到这一点。回到 AngularJs,我使用了 AngularUiBlock,它可以拦截所有 http 请求并显示 block-ui div(防止按钮被点击),还有一个不错的 spinner,但我没有找到这样的解决方案对于 ng2。我应该使用全局操作来加载并使用全局效果来显示这些元素吗?是否每个组件都必须实现此逻辑?

最佳答案

正确的方法是在模型状态下跟踪服务器交互:

export interface ItemState {
  entities: { [id: number]: Item };
  loaded: boolean;
  loading: boolean;
}

export const initialState: ItemState = {
  entities: {},
  loaded: false,
  loading: false
};

然后你的 reducers 应该在更新应用程序状态时根据分派(dispatch)的 Action 正确地编辑它们。可能是这样的:

export function reducer(state = initialState, action: fromItems.ItemsAction): ItemState {
  switch (action.type) {
    case fromItems.CREATE_ITEM:
    case fromItems.LOAD_ITEMS: {
      return {
        ...state,
        loading: true
      };
    }

    case fromItems.CREATE_ITEM_SUCCESS:
    case fromItems.LOAD_ITEMS_SUCCESS: {
      const items = action.payload;
      const entities = ...
      return {
        ...state,
        loading: false,
        loaded: true,
        entities
      };
    }

    case fromItems.CREATE_ITEM_FAIL:
    case fromItems.LOAD_ITEMS_FAIL: {
      return {
        ...state,
        loading: false,
        loaded: false
      };
    }
    ...

您还可以在 the official ngrx demo app 中看到类似的示例.您还需要在完成时为它们创建选择器 here这样它们就可以被您的组件观察到。

主要思想如下:

  1. 您的组件分派(dispatch)一个操作 GET_ITEMS (作为示例)
  2. 您的 reducer 会将 state.loading 设置为 true
  3. 监听 GET_ITEMS 操作的副作用将触发对后端服务器的 http 调用。然后,根据收到的响应,相同的副作用将派发 GET_ITEMS_SUCCESSGET_ITEMS_FAIL 操作。
  4. 您的 reducer 应该使用更新的 loadedloading 值重新创建一个新状态。与此同时,您的组件正在观察它们并通过相应地显示或隐藏/禁用数据来更新您的 DOM。

关于angular - 使用 Angular 和 ngRx 显示微调器和加载事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897378/

相关文章:

reactjs - Redux-persist 继续加载

angular - ngrx4 效果中的多个操作 -> forkJoin 未按预期工作

javascript - 在 Angular 中挣扎于 AuthGuard

Angular - 如何在 Angular 9 - Ivy 中进行代码拆分?

angular - 如何使用深度相等(Angular 7)

javascript - 为什么要将 Redux Action 创建者返回的 Action 括在括号中?

angular - p-轮播行为不可预测

reactjs - 导入 redux 结果为 undefined

angular - NGRX - 每次效果后运行函数

angular - NGRX状态突变