Это открытая проблема github https://github.com/ngrx/platform/issues/1934
Однако я считаю, что есть способ сделать это, не начав с нуля, используя метод EntityCacheDispatcher saveEntities
Сохранение с EntityCacheDispatcher.saveEntities () .
Чтобы дать вам представление о том, как это работает при использовании по назначению, вот мой эффект порядка сохранения для недавнего проекта
saveOrder$ = createEffect(() =>
this.actions$.pipe(
ofType(PurchaseOrderActions.saveOrder),
switchMap(() => {
const order$ = this.store.pipe(select(selectHeader));
const orderLines$ = this.store.pipe(select(allLines));
const deletedOrderLines$ = this.store.pipe(select(selectDeletedLines));
return combineLatest([order$, orderLines$, deletedOrderLines$]).pipe(
first(),
switchMap(([order, lines, deletedLines]) => {
const changes: ChangeSetItem[] = [
cif.upsert("PurchaseOrder", order),
cif.upsert("PurchaseOrderLine", lines),
cif.delete("PurchaseOrderLine", deletedLines)
];
return this.entityCacheDispatcher
.saveEntities(changes, `${this.baseURL}order`)
.pipe(
map(changesResponse =>
PurchaseOrderActions.saveOrderSuccess({
header: changesResponse.changes[0]
.entities[0] as PurchaseOrder,
lines: changesResponse.changes[1]
.entities as PurchaseOrderLine[]
})
)
);
})
);
})
)
);
Потенциальная дорожная карта
- Создайте свое пользовательское действие, например, введите
"[OrderProductsPage ONINIT] ONINIT"
- Создайте эффект, который вызывает saveEntities
// include in custom action payload and get this id here
const id;
// changeSet with empty changes
const changeSet = {
changes: [],
tag: "CUSTOM_GET_PRODUCTS" // hook for defining custom behaviour
}
this.entityCacheDispatcher.saveEntities(changeSet, `orders/${id}/products`)
Расширьте
EntityCacheDataService
и переопределите метод
saveEntities
, чтобы сначала проверить, является ли тег
CUSTOM_GET_PRODUCTS
, иначе вызовите super.saveEntities (changeSet, url). Если тег равен
CUSTOM_GET_PRODUCTS
, то вызовите, чтобы получить http и карту каналов для изменения. Установите с помощью
ChangeSetOperation.Add
Ссылка на super.saveEntities ()
Обновление
Это работает, но немного более хакерски, чем хотелось бы