При создании компонента / директивы Angular выполняет набор методов, известных как ловушка жизненного цикла. Этот механизм описан здесь:
https://angular.io/guide/lifecycle-hooks
Проблема в том, что все методы этого жизненного цикла выполняются в один и тот же ход javascript vm и когда вы выбираете создается первое значение (здесь желтый) и вызывает эту ошибку.
Решение, как сказано в предыдущем ответе, заключается в использовании ngModel для отслеживания выбранного цвета. Чтобы выбрать первый цвет по умолчанию, я использую функцию setTimeout, которая позволяет отложить выполнение на следующий javascript vm ход и избежать предыдущей ошибки.
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements AfterViewInit {
name = 'Angular';
COLORS = ['yellow', 'red', 'blue'];
selectedColor: string;
ngAfterViewInit(): void {
setTimeout(() => {
this.selectedColor = this.COLORS[0];
});
}
}
Затем связать выбранный цвет с вашей директивой, используя вход.
@Directive({
selector: '[customDirective]'
})
export class CustomDirectiveDirective {
@Input() color: string;
constructor(private readonly element: ElementRef) { }
@HostListener('mouseenter') mouseEnter(){
// Some code
}
@HostListener('mouseleave') mouseLeave(){
// Some code
}
}
Вот пример использования стекаблиц: https://stackblitz.com/edit/angular-ssq5af