我正在尝试使用ngrx/data向存储添加多个实体->saveEntities。到目前为止,我得到了这个:
@Injectable()
export class MaintenanceEntityService extends EntityCollectionServiceBase<Maintenance> {
constructor(
private serviceElementsFactory: EntityCollectionServiceElementsFactory,
private entityCacheDispatcher: EntityCacheDispatcher) {
super('Maintenance', serviceElementsFactory);
}
addBatch(maintenances: Maintenance[]) {
const changes: ChangeSetItem[] = [
cif.add('Maintenance', maintenances)
];
const changeSet: ChangeSet = { changes, tag: 'Creating alert batch'};
return this.entityCacheDispatcher.saveEntities(changeSet, `${environment.API}maintenances`).pipe(
map(response => response)
);
}
}
我的端点接收并返回如下对象:
interface ChangeSet<T = any> {
changes: ChangeSetItem[]
extras?: T
tag?: string
}
在后端,我将所有实体插入数据库,然后在返回相同的对象之前,我更新ID,但在Angular应用程序中,存储没有得到更新。我是不是错过了什么?
https://ngrx.io/api/data/EntityCacheDispatcher#saveentities
好的,ChangeSet
对象有一个名为ChangeSetItem
的属性,具有下一个结构:
type ChangeSetItem = ChangeSetAdd | ChangeSetDelete | ChangeSetUpdate | ChangeSetUpsert;
interface ChangeSetAdd<T = any> {
op: ChangeSetOperation.Add
entityName: string
entities: T[]
}
因此,我需要从后端返回相应的entityName
,以便将其添加到存储中:在我的情况下:维护
不确定为什么没有在此行中设置属性:
const changes: ChangeSetItem[] = [
cif.add('Maintenance', maintenances)
];
创建ChangeSet
时在其上设置entityName
。
const changeSet: ChangeSet = {
entityName: 'Maintenance',
changes,
tag: 'Creating alert batch'
};
这应该可以确保它在那里进行完整的往返旅行。从您的示例中还不清楚cif
是什么,但它似乎只适用于ChangeSetItem
,而不适用于ChangeSet
。
其次,尽管这可能与您无关,但如果您的服务器正在为您保存的实体分配id,则需要启用悲观保存-这可以在各种扩展点完成。如果启用了乐观保存,我认为ngrx在成功时不会对您的变更集做任何事情——例如,新的id不会分配给新的实体。