#angular #redux #state #ngrx #store
#angular #сокращение #состояние #ngrx #Магазин
Вопрос:
Я хочу отфильтровать массив, который поступает из состояния, и вернуть наблюдаемое логическое значение. Это мой селектор
export const customArray = createSelector(
arrayCustomizations,
(entities: Dictionary<Customizations>, props: { id: string }) => {
const customizations = entities[props.id];
return customizations.allCustoms;
},
);
Это возвращает массив объектов. Я хочу получить все объекты, у которых есть свойство ‘name’, например object.name !== null и присвоить его этому
buttonDisabled$=
Если я подпишусь на этот селектор, я могу отфильтровать и получить то, что я хочу, но это не наблюдаемое значение.
Ответ №1:
Для этой цели вы можете использовать pipe
метод rxjs
. Это даст вам наблюдаемое значение.
Используйте вот так.
export const customArray = createSelector(
arrayCustomizations,
(entities: Dictionary<Customizations>, props: { id: string }) => {
const customizations = entities[props.id];
return customizations.allCustoms;
},
).pipe(
filter(object => object.name !== null)
);
Комментарии:
1. Спасибо за ответ, но он возвращает ‘undefined’. Я попробовал это первым,
Ответ №2:
Это эффективно, если манипулировать данными в селекторе. createSelector
запоминается и отслеживает изменения значения и не передает значение слушателю, если значение не меняется.
export const customArray = createSelector(
arrayCustomizations,
(entities: Dictionary<Customizations>, props: { id: string }) => {
const customizations = entities[props.id];
return customizations.allCustoms.filer(o => o.name != null);
},
);
основываясь на приведенном ниже комментарии, альтернативой может быть
в selector.ts
export const customArray = createSelector(
arrayCustomizations,
(entities: Dictionary<Customizations>, props: { id: string }) => {
const customizations = entities[props.id];
return customizations.allCustoms;
},
);
в component.ts
this.result$ = this.store.pipe(select(customArray, { id: '123' })).pipe(
map(result => result.filter(a => a.name != null))
)
Комментарии:
1. Есть ли какой-либо способ сделать это в компоненте? Потому что этот селектор используется другими. Когда я делаю то же самое в компоненте, я получаю undefined.
2. Пара других вариантов — передайте больше реквизитов, отличных от id, для точной настройки результатов. — передайте результат и используйте оператор фильтра на уровне компонента
3. Проверьте оператор map, затем отфильтруйте результат внутри