Проверьте следующий пример .
component.html
<ul>
<li *ngFor="let step of steps; let i = index">
<span class="step" [ngClass]="displayActiveness(i)">
{{step}}
</span>
<button (click)="chooseStep(i)">Click me</button>
</li>
</ul>
component.ts
export class AppComponent {
name = 'Angular 6';
currentStep = 0;
steps = ['step1', 'step2', 'step3', 'step4', 'step5'];
chooseStep(index) {
this.currentStep = index;
}
displayActiveness(index) {
console.log('displayActiveness called')
if (index > this.currentStep) {
return 'inactive';
} else {
return 'active';
}
}
}
Когда вы проверите консоль, вы увидите, что метод displayActiveness
вызывается 10 раз при нажатии кнопки Click me
. Это из-за механизма обнаружения угловых изменений. Когда что-то происходит, чтобы вызвать обнаружение изменений, angular пройдет через ваш шаблон и вызовет все. Таким образом, обычно не рекомендуется вызывать функции в шаблонах. Но, допустим, вам абсолютно необходимо это сделать. Затем вы можете использовать трубы.
Проверьте этот второй пример
В этом примере я переместил логику метода displayActiveness
в трубу, чтобы он выполнялся только при изменении входных данных. Это может не сильно отличаться в вашем примере, но подумайте о гораздо более сложном методе. Вы не хотели бы, чтобы angular вызывал ваш сложный метод каждый раз, когда пользователь что-то делает.
active.pipe.ts
@Pipe({
name: 'activePipe'
})
export class ActivePipe implements PipeTransform {
transform(index, currentStep) {
console.log('pipe called')
if (index > currentStep) {
return 'inactive';
} else {
return 'active';
}
}
}
Изменение ngClass
на следующее
<span class="step" [ngClass]="i | activePipe: currentStep">
{{step}}
</span>