如何不从ngrx存储中获取空值

时间:2019-04-27 10:20:12

标签: angular ngrx

我正在用角度7的nrgx / store软件包。

这是我从商店中获取此currentAdAccount的一种方式。问题是我在多个组件中都有这段代码。现在这段代码是错误的,因为将这个值存入存储区的其他事情并没有那么快发生,因此下面的这段代码在最初的1ms内返回空值;然后10毫秒后,它将返回正确的值。因此,为了使此工作有效,我必须在subscription中添加以下内容:if(!currentAdAccount) return;

this.store.select(fromRoot.currentAdAccount).subscribe(currentAdAccount => {
      console.log("nice1", currentAdAccount);
     this.currentAdAccountId = currentAdAccount.value;
    })

因此,在每个地方都不能编写if语句并检查值是否不为空。

问题1)如何以一种非常简单的方式仅获取不为null的值,以使其不会重复?

问题2)您如何处理这种情况?

2 个答案:

答案 0 :(得分:0)

您可以这样写

this.store.pipe(select(fromRoot.currentAdAccount), skip(1))

为使此代码正常工作,您必须像这样在reducer中设置currentAdAccount的初始状态

export const initialState = {
 currentAdAccount: null
}

并在视图中使用异步管道

您遇到了这个问题

  

因此下面的这段代码在前1ms返回null;然后   10ms后,它将返回正确的值

因为状态必须在您第一次加载页面时初始化初始值,然后,还原器将根据您的操作从存储中获取新状态。

如果您有任何问题,请告诉我

答案 1 :(得分:0)

您可以使用.pipe(filter(val => val !== null)).subscribe(currentAdAccount => ...))过滤空值。 NgRx文档将best practice to extract select-and-filter scenarios描述为可管道运算符:

import { select } from '@ngrx/store';
import { pipe } from 'rxjs';
import { filter } from 'rxjs/operators';

export const selectExistingCurrentAdAccount = pipe(
  select(fromRoot.currentAdAccount),
  filter(val => val !== null)
);

并像这样使用它:

this.store.pipe(selectExistingCurrentAdAccount).subscribe(currentAdAccount => ...)