Я реализую директиву, которая принимает язык (или набор языков) в качестве входных данных и добавляет класс к элементу DOM, в который была добавлена директива.
@Directive({
selector: '[appRtlView]'
})
export class RTLViewDirective implements OnInit, OnChanges {
@Input('appRtlView') inputLanguage: string | string[];
constructor(private el: ElementRef) {}
ngOnInit() {
this.handleRtl();
}
private handleRtl() {
if (this.inputLanguage) {
let languageList = null;
if (!Array.isArray(this.inputLanguage)) {
languageList = [this.inputLanguage];
} else {
languageList = this.inputLanguage;
}
// both conditions do stuff with this.el.nativeElement.classList
if (languageList.includes('ar')) {
this.addRtl();
} else {
this.removeIfRtlExists();
}
}
}
}
Ниже я использую директиву. «languagesInView» - это список строк, включенных в компонент, который использует эту директиву, используя @Input () ...
<div *ngIf="concept">
<div class="concept-header" [appRtlView]="languagesInView">
...
</div>
</div>
Я ожидаю, что когда изменятся входные данные languageInView, которые передаются в компонент, значение, которое я передам [appRtlView] в шаблоне, изменится.
(Я вижу, что значение действительно изменяется, печатая значение на экране с использованием интерполяции {{languagesInView}})
В директиве RTLView, если я использую ngOnInit, изменения в поле "inputLanguage" не регистрируются.
Чтобы преодолеть это, я использую ngOnChanges в директиве (реализация OnChanges делает то, что я хочу):
// ngOnInit added because Angular doesn't accept a directive without an OnInit implementation
ngOnInit() {}
ngOnChanges(change: SimpleChanges) {
// TODO: A check to see if the input value has changed or not would help performance
this.handleRtl();
}
Я не смог добавить changeDetectionStrategy к инициализации директивы, и это заставило меня подумать, что директива обычно не должна реализовывать OnChanges. Мой онлайн-поиск мало помог.
Разве неправильно запускать ngOnChanges в угловой директиве?
Спасибо