【问题标题】:Using ngrx to obtain store's current state once使用 ngrx 获取一次 store 的当前状态
【发布时间】:2017-03-09 22:23:42
【问题描述】:

您好,我想知道是否有人知道如何在无需订阅的情况下一次性获取商店的当前状态。我目前正在使用 ngrx 订阅商店并访问其状态以设置组件的属性,但由于我已订阅,此属性会不断刷新。所以我正在寻找一种方法来获得这个属性一次,这样我就可以显示数据而不会不断刷新。

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

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

_store.select('storeData.correlationData');

订阅时我会这样访问:

_store.subscribe(
  (state) => {
    this.correlationData = state.storeData.correlationData;
  }
);

编辑

应用状态:

export interface ApplicationState {
  uiState: UiState;
  storeData: StoreData;
}

【问题讨论】:

    标签: angular ngrx


    【解决方案1】:

    您可以创建getState() 函数,将其放入共享模块并在需要的地方导入。关键是使用take(1)操作符使其同步:

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

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

    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;
    }
    

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

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

    谨慎使用!

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

    【讨论】:

    • 谢谢,我会试试这个并回复你。
    • 我得到了一个TypeError: _store.take is not a function,我正在使用import { Store } from '@ngrx/store',并像这样将它传递给我的构造函数:private _store: Store<ApplicationState>
    • import 'rxjs/add/operator/take';了吗?
    • 谢谢!
    • store.take(1).subscribe(o => _state = o); 此代码是异步的,将返回不带状态的变量。当然,它是一个对象,所以是的,有了引用,你就会有一些价值,但是......我认为这不是一个好主意。为什么不直接返回 Observable ?喜欢return store.take(1) 让用户在后面订阅? (感谢take(1),他不必取消订阅。第二件事是,通过getState(this.store, 'users.address.street'),我不同意“酷”的评论,因为你正在失去类型......
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 2020-03-05
    • 2021-07-25
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多