В настоящее время я работаю над проектом angular 9, и у меня возникла небольшая проблема с обнаружением изменений.
ParentComponent.ts
_themeableElements: QueryList<ThemeableDirective> = new QueryList<ThemeableDirective>();
get themeableElements() {
return this._themeableElements;
}
@ViewChildren(ThemeableDirective) set themeableElements(elements) {
console.log(elements);
this._themeableElements = elements;
}
ngAfterViewInit() {
this.themeableElements.changes.subscribe((changes: QueryList<ThemeableDirective>) => {
this.onThemeableElementsChanged(changes.toArray());
});
this.onThemeableElementsChanged();
}
Directive.ts (ThemeableDirective)
@Input()
themeSelectorConfig: ThemeSelectorConfig;
constructor(private logger: NGXLogger,
public elementRef: ElementRef,
public change: ChangeDetectorRef) {
this.logger.debug('ThemeableDirective: constructed.');
}
ngOnInit(): void {
this.themeSelectorConfig = HelperFunctions.Clone(new ThemeSelectorConfig(this.themeSelectorConfig));
}
ngOnChanges(changes: SimpleChanges) {
if (changes.themeSelectorConfig) {
this.themeSelectorConfig = HelperFunctions.Clone(new ThemeSelectorConfig(this.themeSelectorConfig));
this.change.detectChanges()
}
}
каким-либо образом, всякий раз, когда я изменяю свойство ввода в моей директиве (и вызываю detectChanges), родительский компонент вообще не обновляется. Я знаю, что changedetection не проводит глубокое сравнение массивов, поэтому я использую функцию clone.
Может кто-нибудь, возможно, укажет мне правильное направление, почему обнаружение изменений на родителе не работает? Глупо то, что это работает, когда я изменяю размер окна. Он обновляет все, но не сразу, когда изменяется свойство в директиве.