2017-08-02 2 views
3

Je sais qu'il y a beaucoup de questions déjà posées dans stackoverflow et j'ai essayé différentes solutions pour éviter l'erreur d'exécution, mais aucune d'entre elles ne fonctionne pas pour moi.ExpressionChangedAfterItHasBeenCheckedError: L'expression a été modifiée après sa vérification. Valeur précédente: 'undefined'

Error

composants et Code Html

export class TestComponent implements OnInit, AfterContentChecked { 
    @Input() DataContext: any; 
    @Input() Position: any; 
    sampleViewModel: ISampleViewModel = { DataContext: : null, Position: null }; 
    constructor(private validationService: IValidationService, private modalService: NgbModal, private cdRef: ChangeDetectorRef) { 
    } 

    ngOnInit() { 

    } 
    ngAfterContentChecked() { 

      debugger; 
      this.sampleViewModel.DataContext = this.DataContext; 
      this.sampleViewModel.Position = this.Position; 

    } 


<div class="container-fluid sample-wrapper text-center" [ngClass]="sampleViewModel.DataContext?.Style?.CustomCssClass +' samplewidget-'+ sampleViewModel.Position?.Columns + 'x' + sampleViewModel.Position?.Rows"> 
    //some other html here 
</div> 

S'il vous plaît Remarque: Ce composant est chargé dynamiquement à l'aide DynamicComponentLoader

Après mon tir de détresse, je l'ai identifié quelques questions

tout d'abord ce composant enfant est chargé dynamiquement en utilisant DynamicComponentResolver et passer les valeurs d'entrée comme ci-dessous

ngAfterViewInit() { 
    this.renderWidgetInsideWidgetContainer(); 

    } 


    renderWidgetInsideWidgetContainer() { 
    let component = this.storeFactory.getWidgetComponent(this.dataSource.ComponentName); 
    let componentFactory = this._componentFactoryResolver.resolveComponentFactory(component); 
    let viewContainerRef = this.widgetHost.viewContainerRef; 
    viewContainerRef.clear(); 
    let componentRef = viewContainerRef.createComponent(componentFactory); 
    debugger; 
    (<IDataBind>componentRef.instance).WidgetDataContext = this.dataSource.DataContext; 
    (<IDataBind>componentRef.instance).WidgetPosition = this.dataSource.Position; 

    } 

Même si je changeais mon html composant enfant comme ci-dessous, je reçois ce même error.Just ajouter un angle ngclass attribut

<div class="container-fluid ds-iconwidget-wrapper text-center" [ngClass]="Sample"> 

</div> 

Mon databinding et tout travaillent fine.Do je dois faire quoi que ce soit sur le composant parent? J'ai déjà essayé tous les événements lifecyle dans le composant enfant

+0

Comment ajouter 'TestComponent'? –

+0

@Maximus comme composant d'entrée – JEMI

+0

@Maximus J'ai essayé en appelant this.cdRef.detectChanges(); explicitement mais ne fonctionne pas – JEMI

Répondre

3

Le hook de cycle de vie ngAfterContentChecked est déclenché lorsque les mises à jour des liaisons pour les composants/directives enfant ont déjà été terminées. Mais vous mettez à jour la propriété utilisée comme entrée de liaison pour la directive ngClass. C'est le problème. Lorsque Angular exécute l'étape de validation, il détecte qu'une mise à jour des propriétés est en attente et renvoie l'erreur.

Pour comprendre l'erreur mieux, lire ces deux articles:

Pensez à pourquoi vous avez besoin de changer la propriété dans le crochet du cycle de vie ngAfterViewInit. Tout autre cycle de vie déclenché avant ngAfterViewInit/Checked fonctionnera, par exemple ngOnInit ou ngDoCheck ou ngAfterContentChecked. Pour résoudre ce problème, déplacez renderWidgetInsideWidgetContainer vers le crochet de cycle de vie ngOnInit().

+1

J'ai déjà essayé this.cd.detectChanges() mais ne fonctionne pas – JEMI

+0

pourquoi mettez-vous à jour la propriété dans 'ngAfterViewInit/Checked'? –

+0

En fait, il ne met pas à jour Je place mes données d'entrée dans un viewmodel et finalement toutes les propriétés sont liées à ce modèle comme la classe wrapper. Lorsque je lier directement le @acquittement @Input, je reçois la même erreur. Il n'y a aucune solution pour contourner cette erreur à travers l'un des événements du cycle de vie. Laissez-moi essayer ngAfterViewInit/Checked mentionné dans votre réponse – JEMI

1

vous devez dire que vous angulaire mis à jour le contenu après ngAfterContentChecked vous pouvez importer ChangeDetectorRef de @ angulaire/noyau et appelez detectChanges

import {ChangeDetectorRef } from '@angular/core'; 

constructor(private cdref: ChangeDetectorRef) {} 



ngAfterContentChecked() { 

debugger; 
this.sampleViewModel.DataContext = this.DataContext; 
this.sampleViewModel.Position = this.Position; 
this.cdref.detectChanges(); 

    } 
+0

Voir mes commentaires en question J'ai déjà essayé cette solution mais je reçois toujours la même erreur – JEMI