我有一个用于搜索的NGRX商店,如下所示:
export interface State {
field: string;
operator: string;
criteria: string;
offset: number;
limit: number;
}
并且由于我有多种搜索功能,因此我在主状态对象中创建了该搜索状态的多个实例:
// In index.ts
export interface State {
search: {
main: searchReducer.State;
other: searchReducer.State;
};
}
还有一个参数化选择器以获取正确的选择器:
export const chooseSearchInstance = (instance: string): ((state: State) => searchReducer.State) => {
switch(instance) {
case 'MAIN': {
return getMainSearchState;
}
case 'OTHER': {
return getOtherSearchState;
}
}
};
我正在尝试对搜索执行一些分页,因此我需要在效果中使用上述选择器,以了解它是否仍是相同的搜索。但是,由于“ withLatestFrom”仅需要一个额外的Observable源而不是一个回调,所以我不确定如何在Effect中指定它吗?
@Effect()
public searchItems: Observable<Action> = this.actions.pipe(
ofType<searchActions.PerformSearchAction>(searchActions.PERFORM_SEARCH),
withLatestFrom(this.store.select(rootReducers.chooseSearch( action.payload.instance)), // <-- Cannot do this since there is no access to action at this point.
switchMap(([action, searchState] => (/* ... */))
);
我还尝试过使用直接使用this.store.select的mergeMap,但它导致了无限循环,因为这种效果最终会修改状态,从而触发mergeMap中的选择器。
那么我将如何获得要在此效果中使用的搜索状态的特定实例? (我想我也会接受这样的答案:如果有更好的方法来表示相同状态类型的不同实例,那么整个实例的想法是错误的。)
答案 0 :(得分:0)
在尝试访问include <stdio.h>
include <stdlib.h>
int main(int argc, char *argv[])
{
int x, y, z;
printf("Enter value for x: ");
scanf("%d", &x);
if(x < 1)
{
printf("Invalid value\n");
exit(1);
}
printf("Enter value for y: ");
scanf("%d", &y);
if(y < 1);
{
printf("Invalid value\n");
}
printf("Enter value for z: ");
scanf("%d", &z);
if(z < 1);
{
printf("Invalid value\n");
exit(1);
}
int lhs = x * x + y * y;
int rhs = z * z;
if(lhs == rhs)
{
printf("Right angled triangle\n");
}
else
{
printf("%d is not right angled and equal %d\n", lhs, rhs );
}
中的操作时,我遇到了完全相同的问题,这就是我的解决方法:
withLatestFrom
请注意使用// Same as withLatestFrom but used mergeMap/forkJoin because of use of action.payload
mergeMap((action) => forkJoin(
of(action),
this.store.pipe(select(rootReducers.chooseSearch(action.payload.instance)), take(1)),
)),
switchMap([action, searchState] => (/* ... */))
,否则该代码将挂起我的经验,它只是从Parameterized Selector中获取值。它没有它就挂起了,因为我认为take(1)
等待所有可观察对象完成,并且forkJoin
进行一次发射然后完成。