我的状态是:
export interface RequestState {
tabsContent: TabContent[];
}
其中TabContent
代表一个视觉选项卡数组,每个视觉选项卡包含1个Request和其他信息:
export interface TabContent {
tabInfo: TabInfo;
request: Request;
results?: any[];
}
我有这个专门的选择器,可以从单个TabContent中获取一个请求:
export const getRequestForTabInfo = (tabInfo: TabInfo) => createSelector(
getTabContent,
(tabContent: TabContent[]) => {
const tabContentFiltered = tabContent.filter(tab =>
tab.tabInfo.id === tabInfo.id
&& tab.tabInfo.index === tabInfo.index
&& tab.tabInfo.state === tabInfo.state);
if (tabContentFiltered && tabContentFiltered.length === 1) {
return tabContentFiltered[0].request;
}
return {} as Request;
},
);
这是获取所有TabsContent的基本方法:
export const getTabContent = createSelector(
getRequestFeatureState,
state => state.tabsContent,
);
基于此FeatureSelector:
const getRequestFeatureState = createFeatureSelector<RequestState>('requests');
在外观服务中定义:
tabsContent$: Observable<TabContent[]>;
constructor(private store: Store<fromRequest.State>) {
this.tabsContent$ = this.store.pipe(
select(fromRequest.getTabContent),
takeUntil(this.componentDestroy()),
);
}
public getRequest(tabInfo: TabInfo): Observable<Request> {
return this.store.pipe(
select(fromRequest.getRequestForTabInfo(tabInfo)),
takeUntil(this.componentDestroy()),
);
}
并在组件中使用:
private initializeComponent(): void {
this.requestFacade.getRequest(this.tabInfo).pipe(
takeUntil(this.componentDestroy()),
).subscribe(request => {
console.log('request : ', request);
this.request = request;
});
this.requestFacade.tabsContent$.pipe(
takeUntil(this.componentDestroy()),
).subscribe(tab => {
console.log('tab : ', tab);
});
}
构造该组件时,会同时获得两个日志,但是当我更新部分相关状态(我更新了一个请求的内容)时,只会显示tab
日志。
为什么观察到过滤的选择器什么也不做?
答案 0 :(得分:1)
您在getRequestForTabInfo选择器中使用了一个静态参数,因此它假定它不会随着时间的推移而更改,这就是为什么您没有得到更改的原因。
建议不要分派参数,而是建议分派操作以在存储中设置选定的tabinfo并使用选择器进行检索。您已经存储了TabContents,因此应该能够重用您已经拥有的某些逻辑。