NgRx селектор фильтра нулевые значения - PullRequest
0 голосов
/ 05 сентября 2018

Наше веб-приложение загружает в хранилище NgRx значения, для которых в исходном состоянии установлено значение NULL. Я ищу способ красиво фильтровать ненулевые значения, потому что я постоянно вижу в компонентах

this.myValue = this.store.pipe(
  select(mySelector),
  filter(notNull),
);

// where 

const notNull = (data) => data !== null;

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

Одна вещь, которую я попробовал, это кастом createSelector:

import {createSelector, createSelectorFactory, defaultMemoize} from '@ngrx/store';

const isEqualOrNull = (a: any, b: any): boolean =>
  a === b || b === null;

const createSelectorNotNull = createSelectorFactory((projectionFn) =>
  defaultMemoize(projectionFn, isEqualOrNull));

К сожалению, это решение не будет обрабатывать начальные null значения, только дальнейшие.

Есть ли хорошее решение этой, казалось бы, частой проблемы?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Я не думаю, что это возможно, потому что, как вы уже упоминали в первый раз, он не будет использовать функции сравнения, которые вы предоставляете, а просто выполняет и возвращает результат.

Чтобы избежать дублирования кода, вы можете создать вашего собственного оператора .

0 голосов
/ 06 сентября 2018

В итоге я пришел к тому же выводу, что и @ timdeschrver.

import { select } from '@ngrx/store';
import { notNull } from './utils';
import { filter } from 'rxjs/operators';

export const selectNotNull = (selector, ...args) => (source$) =>
  select(selector, ...args)(source$)
    .pipe(filter(notNull));
0 голосов
/ 05 сентября 2018
const isEqualOrNull = (state): boolean => state.a === state.b || state.b === null;



export const selectorNotNull = createSelector(
 youState,
 isEqualOrNull
);

Вы должны передать свое состояние селектору!

...