Je sais qu'il y a beaucoup de questions identiques déjà postées dans stack-overflow et j'ai essayé différentes solutions pour éviter l'erreur d'exécution mais aucune d'entre elles ne fonctionne pour moi.
Composant 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>
Remarque : Ce composant est chargé dynamiquement à l'aide du DynamicComponentLoader.
Après mon enquête, j'ai identifié quelques problèmes.
Tout d'abord, ce composant enfant est chargé dynamiquement en utilisant DynamicComponentResolver et en passant 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 j'ai modifié le html de mon composant enfant comme ci-dessous, j'obtiens la même erreur. il suffit d'ajouter un attribut angular ngclass.
<div class="container-fluid ds-iconwidget-wrapper text-center" [ngClass]="Sample">
</div>
Mes liaisons de données et tout le reste fonctionnent bien, dois-je faire quelque chose sur le composant parent ? J'ai déjà essayé tous les événements du cycle de vie dans le composant enfant.
0 votes
Comment ajouter
TestComponent
?1 votes
@Maximus comme composant d'entrée
0 votes
@Maximus J'ai essayé d'appeler this.cdRef.detectChanges() ; explicitement, mais cela ne fonctionne pas.
0 votes
J'ai posté l'explication du pourquoi de l'erreur. Pourquoi devez-vous mettre à jour le
sampleViewModel
dans lengAfterViewInit
le crochet du cycle de vie ?0 votes
@Maximus Initialement, j'ai directement lié la propriété datacontext au modèle et ensuite j'ai essayé ce ngAfterContentChecked . Dans les deux cas, je reçois l'erreur.
0 votes
Qu'est-ce qui n'est pas clair dans ma réponse ?
1 votes
Tout d'abord, déplacez
this.renderWidgetInsideWidgetContainer();
dengAfterViewInit
àngOnInit
0 votes
@Maximus Merci Maximus. Mon problème a été résolu après avoir déplacé this.renderWidgetInsideWidgetContainer() ; vers ngOnInit. En fait, dans la documentation officielle d'Angular, on peut lire ce qui suit angular.io/guide/dynamic-component-loader ils utilisent ngAfterViewInit.
0 votes
@Maximus Si vous pouvez ajouter l'information ci-dessus dans la réponse, cela sera utile aux autres et je peux la marquer comme réponse.
0 votes
@JEMI, j'ai ajouté cela à la réponse. Vous pouvez maintenant l'accepter. Merci. Pour comprendre pourquoi ils peuvent utiliser
ngAfterViewInit
et vous ne pouvez pas comprendre ma réponse et tous les détails mentionnés dans les articles que j'ai référencés.1 votes
@Maximus J'apprécie votre temps. Votre article est génial.
1 votes
@JEMI, de rien) J'ai beaucoup d'articles intéressants, à consulter.
1 votes
@Maximus Sure. Je suis déjà votre follower maintenant. Votre chaque article sont dans la profondeur très.
0 votes
Directive officielle pour l'erreur d'Angular - angular.io/errors/NG0100
0 votes
Qu'est-ce que la solution ?