NgRx选择器过滤空值

时间:2018-09-05 16:20:18

标签: angular rxjs ngrx

我们的Web应用程序将NgRx存储中的值加载为初始状态下设置为null的值。我正在寻找一种很好地过滤非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 :(得分:2)

我认为这是不可能的,因为正如您第一次提到的那样,它不会使用您提供的比较功能,而只是执行并返回结果。

为避免代码重复,您可以创建your own pipeable operator

答案 1 :(得分:1)

最终,我得出与@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));

答案 2 :(得分:0)

const isEqualOrNull = (state): boolean => state.a === state.b || state.b === null;



export const selectorNotNull = createSelector(
 youState,
 isEqualOrNull
);

您必须将状态传递给选择器!