从Reducer中调用选择器

时间:2018-04-08 00:26:31

标签: javascript typescript redux ngrx ngrx-store

我可以使用减速器中的选择器吗?

我有一个类似的代码:

    case Action Types.ACTION: {
          const loading = getIsLoading(state) 
           return {
               atribute1: false,
               attribute2: action.payload,
           }
       }

       default: {

           return state;

       } 

   }

}


export const getState = createFeatureSelector<State>('feature');

export const getIsLoading = createSelector(

   getState,

   state => state.loading

);

当我首先发出一个动作时,我得到一个错误:“无法读取未定义的'加载'。

我的错误在哪里?我的方法出了什么问题?

1 个答案:

答案 0 :(得分:0)

就像我在评论中所述:最好不要在州内复制信息。如果您需要在减速机中调用选择器,它看起来像您和#39;我会这样做。

您可以通过创建第三个更高阶的减速器来避免这样做,该减速器将返回现有的减速器。

所以你有getIsBusy reducer并且你创建另一个只会从你的状态返回新数据的那个,你要读的那个是isBusy:

export const getAttribute = createSelector(
   getState,
   state => state.attribute

);

现在你有getIsBusy和getAttribute作为选择器,你可以创建第三个,你可以放置你需要的任何逻辑:

export const getHigherOrderSelector = createSelector(
   getIsBusy,
   getAttribute,
   (isBusy, data) => {
      return { isBusy, data };
      // Or whatever other processing you might want to do here
   }
);