2

我有一个选择器:

const mySelector = createSelector(
  selectorA,
  selectorB,
  (a, b) => ({
    field1: a.field1,
    field2: b.field2
  })
)

我知道选择器的任何输入发生变化时都会对其进行评估。

在我的用例中,我需要通过第三个选择器“controlSelector”来控制“mySelector”,方式如下:

  • 如果“controlSelector”为假,“mySelector”即使在“selectorA”和/或“selectorB”发生变化的情况下也不会评估新值,并返回记忆值

  • 如果“controlSelector”为真,“mySelector”行为正常。

有什么建议么?

4

2 回答 2

0

选择器是纯函数。当输入参数改变时,它会重新计算。

对于您的情况,最好有另一个状态/对象来存储先前的迭代值。您可以将其作为选择器传递,并根据 controlSelector 值决定可以返回的内容。

state : {
  previousObj: {
    ...
  }
}

const prevSelector = createSelector(
  ...,
  (state) => state.previousObj
 )

const controlSelector = createSelector(...);

const mySelector = createSelector(
  controlSelector,
  prevSelector,
  selectorA,
  selectorB,
  (control, a, b) => {
    if(control) {
      return prevSelector.previousObj
    } else {
      return {
        field1: a.field1,
        field2: b.field2
      };
    }
  } 
)
于 2018-02-15T07:47:35.663 回答
0

抱歉耽搁了……我终于解决了不使用 NGRX 选择器来构建那些“高级选择器”并创建一个具有使用 combineLatest、filter、map 和 starWith 函数的类的问题

getPendingTasks(): Observable<PendingTask[]> {
  return combineLatest(
    this.localStore$.select(fromUISelectors.getEnabled),
    this.localStore$.select(fromUISelectors.getShowSchoolHeadMasterView),
    this.memStore$.select(fromPendingTaskSelectors.getAll)).pipe(
      filter(([enabled, shmView, tasks]) => enabled),
      map(([enabled, shmView, tasks]) => {
        console.log('getPendingTasks');
        return tasks.filter(task => task.onlyForSchoolHeadMaster === shmView);
      }),
      startWith([])
    );
}

保持 NGRX 选择器简单并在这种“选择器”中完成繁重的工作(尽管在本例中没有): - 将生成初始默认值 (startWith) - 在过滤条件失败时不会生成新值(即是,当未启用时,其他可观察对象的任何更改都不会触发此可观察对象的新值)

于 2018-10-04T14:30:32.563 回答