Comment gérer Angular2 “l'expression a changé après qu'il a été vérifiée” exception lorsqu'une propriété d'un composant dépend datetime
Mon composant a des styles qui dépendent de courant de type datetime. Dans mon composant, j'ai la fonction suivante.
private fontColor( dto : Dto ) : string {
//date d'exécution du dto
let dtoDate : Date = new Date( dto.LastExecution );
(...)
let color = "hsl( " + hue + ", 80%, " + (maxLigness - lightnessAmp) + "%)";
return color;
}
lightnessAmp
est calculée à partir du courant de datetime. Les changements de couleur si dtoDate
est dans les dernières 24 heures.
L'erreur exacte est la suivante:
Expression a changé après qu'il ait été vérifié. Valeur précédente: 'hsl( 123, 80%, 49%)'. Valeur actuelle: 'hsl( 123, 80%, 48%)'
Je sais que l'exception apparaissent dans le mode de développement qu'au moment où la valeur est vérifiée. Si la valeur est différente de la valeur actualisée, l'exception est levée.
J'ai donc essayé de mettre à jour les datetime à chaque cycle de vie dans la suite de crochet méthode pour empêcher l'exception:
ngAfterViewChecked()
{
console.log( "! changement de la date du composant !" );
this.dateNow = new Date();
}
...mais sans succès.
Vous devez vous connecter pour publier un commentaire.
Exécuter la détection de changement explicitement après le changement:
ngOnInit()
est habituellement la première place. Si le code dépend de la DOM rendungAfterViewInit()
oungAfterContentInit()
sont les options suivantes.ngOnChanges()
est un bon ajustement si le code doit être exécuté à chaque fois qu'une entrée a été modifiée.ngDoCheck()
est personnalisé pour la détection de changement. En fait, je ne sais pas ce quengAfterViewChecked()
est préférable de l'utiliser pour. Je pense qu'il est appelé juste avant ou aprèsngAfterViewInit()
.ngAfterViewChecked()
dans .fichier ts?*ngFor
...clientWidth
, etc.C'est un joli post pour comprendre cette erreur. Ce n'est pas trop long à lire.
Comme mentionné par @leocaseiro sur github problème.
Petite solution de contournement pour ce problème:
Dans notre cas, nous avons CORRIGÉ par l'ajout de changeDetection dans le composant et l'appeler detectChanges() dans ngAfterContentChecked, le code comme suit
Un petit travail, j'ai utilisé de nombreuses fois
JS:
Je fais essentiellement de remplacer la valeur "null" avec une variable que j'utilise dans le contrôleur.
Je pense que la meilleure et la plus propre solution vous pouvez l'imaginer, c'est ce:
Testé Angulaire 5.2.9
Voici un petit extrait de tomonari_t réponse sur les causes de cette erreur, j'ai essayé d'inclure uniquement les parties qui m'a aidé à le comprendre.
L'article complet montre de vrais exemples de code sur chaque point indiqué ici.
La cause racine est angulaire du cycle de vie de l':
Les opérations suivantes sont en cours de vérification à digérer cycle:
Et donc, l'erreur est levée lorsque les valeurs comparées sont différentes., blogueur Max Koretskyi a déclaré:
Et enfin, voici quelques vrais échantillons qui est généralement la cause de cette erreur:
Chaque exemple peut être trouvé ici (plunkr), dans mon cas, le problème a été une composante dynamique de l'instanciation.
Aussi, par ma propre expérience, je recommande fortement tout le monde à éviter la
setTimeout
solution, dans mon cas, a provoqué une "presque" boucle infinie (21 appels que je ne suis pas prêt à vous montrer comment les provoquer),Je vous recommande de toujours garder à l'esprit Angulaire du cycle de vie de sorte que vous pouvez prendre en compte la façon dont ils seraient affectés à chaque fois que vous modifiez une autre composante de la valeur. Avec cette erreur Angulaire est de vous dire:
Le même blog, dit aussi:
Un petit guide pour moi, c'est de considérer au moins deux choses lors de l'encodage (je vais essayer de le compléter au fil du temps):
au lieu de cela: de les modifier à partir de son parent.
@Input
et@Output
directives essayez d'éviter de déclencher lyfecycle modifications, sauf si le composant est complètement initialisé.