2

我如何配置ngrx/data,当我从entityService调用getAll(示例)10秒间隔时使用http。我想全部更改(删除所有不存在的数据)。我体验到它会合并而不是删除已经不存在的东西。

如果可能的话,我会避免使用 clearCache 功能。

export interface IItem {
    id: number;
    data: string;
}
export class MyEntityService extends EntityCollectionServiceBase<IItem> {
    constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
        super("entityKey", serviceElementsFactory);
    }

    // I tried all MergeStrategy but it is not solution for me.
    //
    // getAll(options: EntityActionOptions = { mergeStrategy: MergeStrategy.IgnoreChanges }): Observable<IItem[]> {
    //     return super.getAll(options);
    // }
}
export class MyDataService extends DefaultDataService<IItem> {
    constructor(http: HttpClient, httpUrlGenerator: HttpUrlGenerator) {
        super("entityKey", http, httpUrlGenerator);
    }

    getAll(): Observable<IIncidentItem[]> {
        return this.http.get<IItem[]>('/api/items');
    }
}
export class AnyComponent implements OnDestroy {
    readonly count: Observable<number>;
    private readonly sequenceUpdate;

    constructor(private myEntityService: MyEntityService) {
        this.count = this.myEntityService.entities$.pipe(
            map((data: IItem[]) => data.length)
        );

        // all refresh 
        this.sequenceUpdate = setInterval(() => {
            this.myEntityService.getAll();
        }, 10000);
    }

    ngOnDestroy(): void {
        clearInterval(this.sequenceUpdate);
    }
}

1.运行 我从http获得以下(示例)数据。

[
  { id: 1, data: '1' },
  { id: 2, data: '2' },
  { id: 3, data: '3' },
  { id: 4, data: '4' },
]

count是4。没关系。

2.运行 我从http获得以下(示例)数据。

[
  { id: 1, data: '1' },
  { id: 2, data: '2' },
  { id: 3, data: '3' },
  { id: 4, data: '4' },
  { id: 5, data: '5' },
]

count是5。没关系。

3.运行 我从http获得以下(示例)数据。

[
  { id: 1, data: '1' },
  { id: 2, data: '2' },
  { id: 3, data: '3' },
  { id: 4, data: '4' },
]

count是5。这不好。不删除 id 5,它存在于entityCache.

4

1 回答 1

1

有一个可用的 ADD_ALL 实体缓存操作。请参阅源代码,如下所示。

  /**
   * Replaces all entities in the collection
   * Sets loaded flag to true.
   * Merges query results, preserving unsaved changes
   */
  protected addAll(
    collection: EntityCollection<T>,
    action: EntityAction<T[]>
  ): EntityCollection<T> {
    const entities = this.guard.mustBeEntities(action);
    return {
      ...this.adapter.addAll(entities, collection),
      loading: false,
      loaded: true,
      changeState: {},
    };
  }

未经测试,但类似以下内容应该可以工作(如果您接受数据首先合并的非常小的重叠?)

this.myEntityService.getAll().pipe(
    tap(entities => this.myEntityService.addAllToCache(entities)
)
于 2020-02-28T15:33:07.150 回答