我们的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
值,而只能处理其他值。
对于这个看似频繁的问题是否有很好的解决方案?
答案 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
);
您必须将状态传递给选择器!