使用ngrx获取商店的当前状态一次

Tuc*_*uco 4 ngrx angular

嗨,我想知道是否有人知道如何获得商店的当前状态,而无需订阅它.我目前正在使用ngrx来订阅商店并访问其状态来设置组件的属性,但是因为我订阅了这个属性,所以它不断刷新.所以我正在寻找一种获取此属性的方法,以便我可以在不经常刷新的情况下显示数据.

以防万一,这发生在我的组件的构造函数中.

我一直在尝试这样的事情:

_store.select('storeData.correlationData');

订阅时我会这样访问:

_store.subscribe(
  (state) => {
    this.correlationData = state.storeData.correlationData;
  }
);
Run Code Online (Sandbox Code Playgroud)

编辑

申请状态:

export interface ApplicationState {
  uiState: UiState;
  storeData: StoreData;
}
Run Code Online (Sandbox Code Playgroud)

Sas*_*sxa 6

您可以创建getState()函数,将其放在共享模块中并在需要时导入.关键是通过使用take(1)运算符使其同步:

export function getState(store: any, selector: string) {
  let _state: any;
  store.take(1).subscribe(o => _state = o);
  return _state;
}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的更高级的版本:

export function getState(store: any, selector?: any) {
  let _state: any;
  let state$: any;

  if (typeof selector === 'string' && /\./g.test(selector)) {
    state$ = store.pluck(...selector.split('.'));
  } else if (typeof selector === 'string') {
    state$ = store.map(state => state[selector]);
  } else if (typeof selector === 'function') {
    state$ = store.map(state => selector(state));
  } else {
    state$ = store;
  }
  state$.take(1)
    .subscribe(o => _state = o);
  return _state;
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以通过几种不同的方式获得状态:

getState(this.store) // all data in Store
getState(this.store, 'users')
getState(this.store, state => state.users)
getState(this.store, 'users.address.street') // Cool!
Run Code Online (Sandbox Code Playgroud)

谨慎使用!

正如@Maximes在评论中指出的那样,您应该尝试在代码中直接使用Observables并使用此方法进行测试.

  • 我收到一个'TypeError:_store.take不是一个函数',我正在使用'@ ngrx / store'中的import {Store}并将其像这样传递给我的构造函数:private _store:Store <ApplicationState >` (2认同)
  • 你导入了'rxjs/add/operator/take';`? (2认同)
  • `store.take(1).subscribe(o => _state = o);`这段代码是异步的,变量将在没有状态的情况下返回.当然,这是一个对象所以是的,有了参考,你会有一些价值,但......我认为这不是一个好主意.你为什么不回归'Observable`?就像`return store.take(1)`并让用户订阅?(他不必取消订阅,谢谢take(1).第二件事是,通过`getState(this.store,'users.address.street')`,我不同意"酷"评论你失去了类型...... (2认同)