ngrx: как передать параметры в селектор внутри метода createSelector - PullRequest
0 голосов
/ 29 ноября 2018

У меня очень простое состояние в моем магазине:

const state = {
 records: [1,2,3],
};

У меня есть селектор для записей:

export const getRecords = createSelector(getState, (state: State) => state.records));

И теперь я хочу иметь отдельные селекторы для выборкикаждая запись по индексу.Для этого я хочу создать один общий селектор с реквизитом следующим образом:

export const getRecordByIndex = createSelector(
getRecords,
(state: State, { index }) => state.records[index]),
);

И после этого создать пару конкретных селекторов, например:

export const getFirstRecord = createSelector(
getRecordByIndex(/* somehow pass index = 0 to this selector */),
(firstRecord) => firstRecord),
);

Но я не сделалнайдите упоминание о том, как передавать параметры селекторам с помощью реквизита, когда мы используем их внутри метода createSelector.Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 23 мая 2019

Я использую "@ngrx/entity": "7.2.0",, и я вижу, что реквизиты передаются каждому селектору, например, в моем компоненте, который я звоню:

this.isActive$ = this.store.pipe(select(fromClient.isActive, { id: 'someid' }));

А затем в моем редукторе у меня есть следующее:

export const getClientState = createFeatureSelector<ClientState>('client');

export const getClient = createSelector(
  getClientState,
  (state, props) => {
    // do something with props.id to get the client then:
    return state;
  }
);

export const isActive: = createSelector(
  getClient, // props are passed to here
  (state: any) => { // i don't add the props argument here, as i don't need them
    return state.isActive;
  }
);
0 голосов
/ 10 июля 2019

С фиксированными параметрами для селектора он работает нормально:

this.counter = this.store.pipe(
    select(fromRoot.getCount, { multiply: 2 })
);

, но как насчет динамических параметров:

this.counter = this.store.pipe(
   select(fromRoot.getCount, { multiply: this.getMultiplier() })
);

getMultiplier() {
    ...
    return myUser.multiplier + magicFactor;
}

, которые не работали в моем приложении :-( (версия NgRx8)

0 голосов
/ 29 ноября 2018

Из этого сообщения в блоге: https://blog.angularindepth.com/ngrx-parameterized-selector-e3f610529f8

Начиная с NgRx 6.1, селекторы также принимают дополнительный аргумент props.Это означает, что теперь вы можете определить селектор следующим образом:

export const getCount = createSelector(
  getCounterValue, 
  (counter, props) => counter * props.multiply
);

this.counter = this.store.pipe(
  select(fromRoot.getCount, { multiply: 2 })
);

Ах ... но, перечитывая свой вопрос, вы спрашиваете, как создать другой селектор, который использует этот селектор?Вышеприведенная статья предлагает построить фабричную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...