Как можно контролировать оценку селектора ngrx-store?

У меня есть селектор:

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

Я знаю, что селектор оценивается при изменении любого из его входов.

В моем случае мне нужно управлять mySelector с помощью третьего селектора controlSelector следующим образом:

  • если «controlSelector» имеет значение false, «mySelector» не оценивает новое значение даже в случае изменения «selectorA» и / или «selectorB» и возвращает мемоизированное значение.

  • если controlSelector истинно, mySelector ведет себя нормально.

Какие-либо предложения?


person SFA    schedule 06.02.2018    source источник


Ответы (2)


Селекторы - это чистые функции ... они будут пересчитываться при изменении входных аргументов.

В вашем случае лучше иметь другое состояние / объект для хранения значений предыдущей итерации. Вы можете передать это как селектор, и на основе значения 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
      };
    }
  } 
)
person rijin    schedule 15.02.2018

Извините за задержку ... Я, наконец, решил проблему, не используя селекторы 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) - не будет генерировать новое значение, пока условие фильтра не выполняется (что - когда он не включен, любые изменения в других наблюдаемых объектах не вызывают нового значения этого наблюдаемого)

person SFA    schedule 04.10.2018