Вам нужно использовать индекс для каждой из ваших карт. Ваша проблема нормальная.
Я вижу, barStyle - это один общий пакет для всех ваших карт. Вам нужно обновить barStyle для каждой карты, когда ваши карты приходят из бэкэнда.
Во-первых, в ваших .ts:
service.subscribe(cards => {
let i = 0
cards.forEach(card => {
this.barStyle[i] = // your default barStyle;
i++;
});
Если у вас есть идентификатор для каждой машины, лучше, вы можно избежать использования i . затем в шаблоне:
<mat-card [ngClass]="barStyle[i]" *ngFor="let card of obs; let i = index | async | paginate: { id: 'paginator', itemsPerPage: 10, currentPage: currentPage, totalItems: totalItems }" (click)="highlightCard(i)">
Я вижу, вы используете функцию asyn c в шаблоне. Итак, в TS вы ожидаете и Observable . Чтобы обновить стиль каждой карты, вам необходимо подписаться на услугу и обновить объекты. Итак, нужно внести некоторые изменения:
карты: наблюдаемые станут карты: карта [] ;
loadingData = true;
вызовите службу как:
getData() {
this.loadingData = true;
service().subscribe(cards => {
cards.forEach(card => {
this.barStyle[card.id] = // your default barStyle;
this.cards = cards;
this.loadingData = false; // this is set false only after data is loaded
});
}
highlightCard(id: number) {
if (this.barStyle[id] === 'card') {
this.barStyle[id] = 'cardHighlight';
} else {
this.barStyle[id] = 'card';
}
}
в шаблоне:
<mat-card ***ngIf="!loadingData"**
[ngClass]="barStyle[card.id]"
*ngFor="let card of obs | async |
paginate: { id: 'paginator',
itemsPerPage: 10,
currentPage: currentPage,
totalItems: totalItems }"
(click)="highlightCard(card.id)">
Иногда ваш шаблон будет отрисовываться перед загрузкой данных, поэтому вам нужно используйте булево значение для ожидания.
** Чтобы сохранить чистый код, для разбивки на страницы вы можете использовать переменную, инициализированную в .ts *