Как я могу сконфигурировать данные NgRx, которые я хотел бы обмениваться данными, а не объединять? - PullRequest
1 голос
/ 18 января 2020

Как мне сконфигурировать ngrx / data, чтобы при вызове getAll (пример) 10 секунд вставлялись из entityService для использования 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.

1 Ответ

0 голосов
/ 28 февраля 2020

Доступно действие кэширования сущности ADD_ALL. См. source , показанный ниже.

  /**
   * 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)
)
...