5 votes

Appel au crochet de cycle de vie ngOnChanges pour le chargement dynamique des composants d'Angular 2

Est-il prévu que le crochet de cycle de vie ngOnChanges ne soit pas appelé en cas de chargement dynamique du composant ? Seuls le constructeur, ngOnInit et ngAfterViewInit sont appelés pour moi. Cependant, selon le docs il doit être appelé avant ngOnInit.

Je charge le composant comme ceci :

@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

8voto

SirWojtek Points 181

Selon la discussion https://github.com/angular/angular/issues/8903 le chargement des composants dynamiques ne doit pas déclencher ngOnChanges dans le composant enfant même après avoir appelé detectChanges car cet événement est réservé uniquement aux liaisons de modèles.

Si votre composant enfant est chargé uniquement de manière dynamique, vous pouvez utiliser le setter Javascript au lieu de ngOnChanges . Voici l'exemple :

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
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X