Давайте поговорим о нескольких вещах, которые не так в вашем коде.
setStyle
сбивает с толку метод и делает две вещи одновременно. Это действительно что-то устанавливает, но также возвращает значение. Это противоречит принципу единой ответственности, а также сбивает с толку человека, который сначала смотрит html. Поэтому, когда я вижу [ngStyle]="setStyle()"
, я думаю, что с этим кодом что-то не так, потому что в общем случае setter
ничего не возвращает.
- Вы вызываете метод из html, который приводит к непредсказуемому поведению, подобному тому, которое у вас есть сейчас. Это связано с тем, что в Angular эта концепция называется Обнаружение изменений Если вы еще не слышали об этом, вам следует прочитать об этом. Короче говоря, всякий раз, когда происходит событие (щелчок пользователя, запрос xhr и т. Д.), Angular просматривает ваш html и ваш компонент, чтобы определить, изменилось ли что-то. При этом, если в вашем html-файле есть метод, angular вызовет его, чтобы получить значение результата для выполнения некоторых проверок, которые могут быть хорошими в некоторых случаях, если вызываемый метод не делает ничего сверхсложного и завершается очень быстро. Однако в вашем случае он что-то делает, он меняет цвет.
Итак, что мы можем сделать?
Нам нужно разделить логику установки цветов и получения цветов двумя разными методами. Также, если возможно, мы должны избегать вызова методов из html.
Я думаю, что вы пытаетесь назначить разные цвета каждому элементу массива на основе цвета предыдущего элемента. Так что вы можете сделать что-то вроде следующего
@Component({
selector: 'demo',
template: `
<div [ngStyle]="element.style" *ngFor="let element of array1"></div>
`
})
export class DemoComponent implements OnInit {
array1 = [];
color = 'white';
constructor() { }
ngOnInit() {
// get array from somewhere
// this.array1 =
this.array1.forEach(element => {
const colorConfig = this.getNextColor();
element.style = {
'background-color': colorConfig.color,
'height': '382px',
'color': colorConfig.fontColor
};
});
}
getNextColor() {
let fontColor;
if (this.color === 'blue') {
this.color = 'red';
fontColor = 'white';
} else if (this.color === 'red') {
this.color = 'white';
fontColor = 'black';
} else if (this.color === 'white') {
this.color = 'blue';
fontColor = 'white';
}
return {
color: this.color,
fontColor: fontColor
};
}
}