2017-10-20 14 views
0

J'ai un composant Angular 4 avec une variable booléenne. La valeur initiale dépend d'un flux d'entrée.Où initialiser les variables dans un composant Angular 4 - ExpressionChangedAfterItHasBeenCheckedError

TypeScript me demande de déclarer la variable comme dans l'exemple ci-dessous. Sans cela, this.isLoading déclenchera une erreur. À ce stade, je ne sais pas encore sa valeur, donc je le déclare sans affecter de variable.

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    isLoading: boolean; 

    ngOnInit() { 
    someStream.subscribe((someData) => { 
     // Code to determine the value for isLoading 
     this.isLoading = true; 
    }); 
    } 
} 

Plus tard, lorsque je connaîtrai la valeur, je la définirai sur true ou false. Mais alors 'ExpressionChangedAfterItHasBeenCheckedError' entre en jeu.

Quelle est la «bonne façon» de définir ces types de valeurs 'par défaut'.

+0

Essayez cycle de vie ngOnChages() au lieu de ngOnInit(), il pourrait résoudre votre problème. –

+0

Quand et où vous appelez prochain sur someStream? –

+0

@MohamedGara dans le même bloc onInit est une logique qui vérifie les paramètres d'URL. Si tous les paramètres requis sont présents, il lance un appel http et définit isLoading. –

Répondre

0

Je suppose que isLoading est votre drapeau pour savoir si la requête est terminée. Ce que je l'ai fait dans ce scénario était d'initialiser le chargement comme faux:

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    // Initialized as false. 
    isLoading: boolean = false; 

    ... 
} 

Si le drapeau isLoading a plus de logique, je changerais la façon dont vous interagissez avec le composant et changer le @input() pour someData directement, et gérer la logique async dans son parent.

Espérons que ça aide.

+0

J'ai essayé ceci et cela ne fonctionne pas quand isLoading évalue à vrai dans 'la même coche' dans ngOnInit J'obtiens le ExpressionChangedAfterItHasBeenCheckedError. J'ai peur que le déplacement de la variable vers le parent déplace simplement le problème vers un autre composant. –

+0

Un peu bizarre, parce que j'ai exactement le même code que vous et qu'il n'y a pas d'erreur. Pour être sûr, votre abonnement n'est déclenché qu'une seule fois? Peut-être que l'observable envoie de nouvelles valeurs pendant le même cycle. –