NgRx 无需订阅即可获取价值

mwi*_*son 7 rxjs typescript redux ngrx angular

我正在学习一些ngrx教程,我想我已经开始集中注意力了。

我不明白的是如何做一些简单的事情,例如从以下位置获取值Store

目标:无需亲自去商店就能获得价值subscribe。即:store.myStorePropertystore.getValue(<selector>)或?

据我了解,从商店获取价值的唯一方法是执行以下操作:

  private readonly _store: Store<ApplicationState>;
  // ...
  this._store.select(state => state.currentUser).subscribe(user => {
    if (!user) { return; }
    // ...
  });
Run Code Online (Sandbox Code Playgroud)

问题:是否有任何可能的方法可以“立即”从商店获取值而无需订阅?

我可能只是很难理解选择器,但我认为这就是它们的用途。文档中的示例:

import { createSelector } from '@ngrx/store';

export interface FeatureState {
  counter: number;
}

export interface AppState {
  feature: FeatureState;
}

export const selectFeature = (state: AppState) => state.feature;

export const selectFeatureCount = createSelector(
  selectFeature,
  (state: FeatureState) => state.counter
);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想我可以直接调用selectFeature或传递它来this._store.select(selectFeature)获取实际值,但它返回一个observable(因此希望您订阅它)。

我的主要用例是我想在应用程序的整个生命周期中访问当前用户信息。我有一个effect从服务器获取信息的方法,一切都很好。然而,我对如何简单地访问值而store不必.subscribe到处洒水感到有点困惑。

是的,我已经看到了这个,但这对我没有帮助。

Ton*_*Ngo 0

您可以像这样使用异步管道

export class MyComponent implements OnInit {
    data$: Observable<any>;

    constructor(private store: Store<ApplicationState>) {}

    ngOnInit() {
        this.data$ = this.store.pipe(select(yourSelector));
    }
}
Run Code Online (Sandbox Code Playgroud)

那么在你看来

<app-data [data]="data$ | async"></app-data>
Run Code Online (Sandbox Code Playgroud)