Вы повторяете массив через ngFor l oop, это означает, что может быть создано много элементов кнопки, но у вас есть только одна переменная для атрибута цвета, поэтому изменение для одной кнопки должно изменить цвета для всех.
Сказав это, вам придется разработать механизм, чтобы каждый отображаемый элемент кнопки через ngFor должен получить собственную ссылку на цветовую переменную. Увидев ваш код, вы должны либо иметь переменную цвета внутри массива dataArray , либо поддерживать отдельный массив строк, равный по длине dataArray . Примерно так ..
public colorArr:string[]= [];
//initially I've populated dataArray with initial colors.
public ngOnInit(){
this.dataArray.forEach(x=>this.colorArr.push('warning'));
}
Ваш HTML будет изменен, например,
<ion-col size="6" *ngFor="let data of dataArray; let i = index" >
<ion-card>
<ion-card-header>
<ion-button class="fav-icon2" ion-button [color]="colorArr[i]" (click)="changecolor(i)" >
<ion-icon name="heart"></ion-icon>
</ion-button>
</ion-card-header>
</ion-card>
</ion-col>
И ваш метод changeColor будет изменен следующим образом
changecolor(index) {
if(this.colorArr[index] === 'warning') {
this.colorArr[index] = 'primary'
} else {
this.colorArr[index] = 'warning'
}
}
По сути, мы сохраняем цвета в отдельном массиве для каждого отдельного элемента кнопки, не затрагивая исходный dataArray .
Другой подход Можно создать отдельный компонент только для элементов кнопки и передать соответствующие данные через декораторы @ input . В этом случае ваш подход с единственной переменной будет работать.
Спасибо.