2016-11-15 7 views
3

Ist das erwartete Verhalten, dass ngOnChanges lifecycle hook nicht aufgerufen wird, wenn dynamische Komponenten geladen werden? Nur der Konstruktor, ngOnInit und ngAfterViewInit werden für mich aufgerufen. Nach der docs sollte es jedoch vor ngOnInit aufgerufen werden.Angular 2 Dynamisches Laden von Komponenten ngOnChanges lifecycle hook call

Ich lade die Komponente wie folgt aus:

@ViewChild('place', { read: ViewContainerRef }) container: ViewContainerRef; 

    private componentRef: ComponentRef<MyLoggerComponent>; 

    constructor(private componentFactoryResolver: ComponentFactoryResolver) { } 

    ngAfterViewInit() { 
    const componentFactory: ComponentFactory<any> = this.componentFactoryResolver.resolveComponentFactory(MyLoggerComponent); 
    this.componentRef = this.container.createComponent(componentFactory); 
    this.componentRef.changeDetectorRef.detectChanges(); 
    } 

Plunker

+0

ngOnChanges() wird nur aufgerufen, wenn Angular Bindungen Update Eingänge und dynamische erstellt Komponenten unterstützen nicht @Input() oder @Output() – yurzui

+0

Regelmäßige Komponente ngOnchange feuern, wenn es @Input hat porperty und es ist aktualisiert Dieser Plünderer wird nicht funktionieren http://plnkr.co/edit/w2Cc1ssw30ZcP0M2gFdJ?p=preview – yurzui

+0

Hier ist die Arbeit mit einer regelmäßigen Komponente plumpere http://plnkr.co/edit/sFl84z0XY6OpCa5imTvz?p=preview – yurzui

Antwort

1

Nach Diskussion https://github.com/angular/angular/issues/8903 dynamischen Komponenten Laden nicht ngOnChanges in geordnete Komponente auslösen soll auch nach detectChanges Aufruf, weil dieses Ereignis nur für eine Vorlage reserviert Bindungen.

Wenn Ihre untergeordnete Komponente nur auf dynamische Weise geladen wird, können Sie anstelle von ngOnChanges Javascript-Setter verwenden. Hier ist das Beispiel:

export class DynamicallyLoadedComponent { 
    private _property: string; 
    get property(): string { return this._property; } 
    set property(newVal: string) { 
    if (this._property === newVal) { return; } 
    this._property = newVal; 

    this.onChanges(); // instead of ngOnChanges 
    } 
} 
Verwandte Themen