我正在用角度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)您如何处理这种情况?
答案 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 => ...)