您好,我想知道是否有人知道如何在无需订阅的情况下获取商店的当前状态。我目前正在使用 ngrx 订阅商店并访问其状态以设置组件的属性,但由于我订阅了该属性,所以它会不断刷新。因此,我正在寻找一种仅获取此属性一次的方法,以便我可以显示数据而无需不断刷新。
以防万一,这发生在我的组件的构造函数内。
我一直在尝试这样的事情:
_store.select('storeData.correlationData');
订阅时我会这样访问:
_store.subscribe(
(state) => {
this.correlationData = state.storeData.correlationData;
}
);
EDIT
申请状态:
export interface ApplicationState {
uiState: UiState;
storeData: StoreData;
}
您可以创建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 在评论中指出的那样,您应该尝试直接在代码中使用 Observables使用此方法进行测试.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)