如何防止在 NgRx 中第二次加载数据?
How prevent loading data second time in NgRx?
我有一个DOM块:
<div (click)="toggle(block)">
<div *ngIf="block.opened">
<div *ngFor="let item of block.items"></div>
</div>
</div>
通过点击我调度操作从服务器加载数据并在块中显示此数据:
toggle(block: RegistryGroup) {
this.store.dispatch(RegistryActions.ToggleRegistryBlockAction(block));
this.store.dispatch(RegistryActions.LoadRegistryLayersAction(this.block));
}
第一个事件 ToggleRegistryBlockAction
将 block
的 属性 更改为 true/false。
第二个 LoadRegistryLayersAction
向服务器请求 block.id
和 return 的数据到 block
到 属性 block.items = Server Response;
[= 的相同状态23=]
在我听动作的那一边效果LoadRegistryLayersAction
:
loadRegistriesLayers$: Observable<Action> = createEffect(() =>
this.actions$.pipe(
ofType(RegistryActions.LoadRegistryLayersAction),
filter(
(registryGroup) =>
registryGroup.items && !registryGroup.items.length
),
switchMap((registryGroup: RegistryGroup) =>
from(this.registry.getRegistryLayers(registryGroup.Id)).pipe(
map((layers: { [key: string]: RegistryLayerItemGeneric[] }) => {
return RegistryActions.SuccessLoadRegistryLayersAction({
payload: {
layers: this.registry.createLayersMapWithObjects(layers),
registryGroupId: registryGroup.Id,
},
});
}),
catchError((error: Error) => {
return of(RegistryActions.ErrorRegistryLayersAction(error));
})
)
)
)
);
I filter
操作并检查数据是否已经存在。为此,我检查块是否有 registryGroup.items && !registryGroup.items.length
.
问题是有时在执行此效果服务器后 return 清空 []
。所以下次,当用户请求它时,它会重复发送请求。
如何修复它并且在加载数据时不接触服务器?
有多种解决方案:
- 保持状态 属性,可以是
loading
、loaded
、empty
、...
- 保留在状态中获取的 ID 列表,并在发送请求之前检查此列表
- 不检查
registryGroup.items.length
,并将数组初始化为 null
我有一个DOM块:
<div (click)="toggle(block)">
<div *ngIf="block.opened">
<div *ngFor="let item of block.items"></div>
</div>
</div>
通过点击我调度操作从服务器加载数据并在块中显示此数据:
toggle(block: RegistryGroup) {
this.store.dispatch(RegistryActions.ToggleRegistryBlockAction(block));
this.store.dispatch(RegistryActions.LoadRegistryLayersAction(this.block));
}
第一个事件 ToggleRegistryBlockAction
将 block
的 属性 更改为 true/false。
第二个 LoadRegistryLayersAction
向服务器请求 block.id
和 return 的数据到 block
到 属性 block.items = Server Response;
[= 的相同状态23=]
在我听动作的那一边效果LoadRegistryLayersAction
:
loadRegistriesLayers$: Observable<Action> = createEffect(() =>
this.actions$.pipe(
ofType(RegistryActions.LoadRegistryLayersAction),
filter(
(registryGroup) =>
registryGroup.items && !registryGroup.items.length
),
switchMap((registryGroup: RegistryGroup) =>
from(this.registry.getRegistryLayers(registryGroup.Id)).pipe(
map((layers: { [key: string]: RegistryLayerItemGeneric[] }) => {
return RegistryActions.SuccessLoadRegistryLayersAction({
payload: {
layers: this.registry.createLayersMapWithObjects(layers),
registryGroupId: registryGroup.Id,
},
});
}),
catchError((error: Error) => {
return of(RegistryActions.ErrorRegistryLayersAction(error));
})
)
)
)
);
I filter
操作并检查数据是否已经存在。为此,我检查块是否有 registryGroup.items && !registryGroup.items.length
.
问题是有时在执行此效果服务器后 return 清空 []
。所以下次,当用户请求它时,它会重复发送请求。
如何修复它并且在加载数据时不接触服务器?
有多种解决方案:
- 保持状态 属性,可以是
loading
、loaded
、empty
、... - 保留在状态中获取的 ID 列表,并在发送请求之前检查此列表
- 不检查
registryGroup.items.length
,并将数组初始化为null