Quand je définis une variable à l'intérieur d'une fonction, je ne peux pas l'utiliser à l'extérieur.
J'ai essayé de définir une variable dans NgOnInit
et cela ne fonctionne pas non plus.
Mon code:
addLink() { if( this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') { firebase.auth().onAuthStateChanged(function(user) { if (user) { let uid = user.uid; console.log(uid) //THIS WORK } }); console.log(uid); //THIS DONT WORK this.productService.addProduct(this.product); this.product = {} as Product; } }
L'erreur que j'obtiens:
TS2304: Impossible de trouver le nom 'uid'.
5 Réponses :
Cela est dû au fait que la portée des variables déclarées comme let
est limitée par le bloc dans lequel elles sont définies, pour l'utiliser, vous la déclarez simplement en dehors de la portée de votre fonction.
addLink() { if( this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') { let uid; firebase.auth().onAuthStateChanged(function(user) { if (user) { uid = user.uid; console.log(uid) //THIS WORK } }); console.log(uid); //THIS ALSO WORKS ;) this.productService.addProduct(this.product); this.product = {} as Product; }
Je déconseillerais fortement d'utiliser var quand il s'agit de dactylographié / angulaire, soit fourni en gardant à l'esprit la portée et non levage, avec var nous finirons par mélanger les choses.
Je n'ai pas réalisé que cela fonctionnait dans Typescript, désolé pour cela.
Pas de problème, ça arrive ... il s'agit simplement d'être plus prudent car nous pourrions finir par fournir des informations erronées
Le code ci-dessus fonctionne comme il se doit. Avec un «let» dans une fonction, ce n'est que temporaire. Créez plutôt une variable juste après avoir déclaré la classe:
export class FooBatComponent implements OnInit { uid: number; ... addLink() { if( this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') { firebase.auth().onAuthStateChanged(function(user) { if (user) { this.uid = user.uid; console.log(this.uid) } }); this.productService.addProduct(this.product); this.product = {} as Product; } }
Lancez cette erreur: ERROR Erreur: Uncaught (en promesse): TypeError: Impossible de définir la propriété 'uid' de non défini TypeError: Impossible de définir la propriété 'uid' de undefined
C'est parce que uid
est une variable de portée de bloc. Pour en savoir plus sur la portée des variables, ici . Vous pouvez également effectuer les modifications suivantes dans votre code pour obtenir uid
en dehors de if
condition addLink() {
let uid;
if(this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
uid = user.uid;
console.log(uid) //THIS WORK
}
});
console.log(uid); //THIS WILL WORK TOO
this.productService.addProduct(this.product);
this.product = {} as Product;
}
}
Maintenant, je n'ai aucune erreur mais "uid" dans le console.log en dehors de la fonction n'est pas défini
oui car la variable uid
n'est pas définie globalement. Vous devez ajouter la variable avant le constructeur pour la rendre globale comme la variable product
dans votre code
Veuillez essayer la réponse donnée par Dan . C'est exactement ce dont vous avez besoin
Lancez cette erreur: ERROR Erreur: Uncaught (en promesse): TypeError: Impossible de définir la propriété 'uid' de non défini TypeError: Impossible de définir la propriété 'uid' de undefined
Oui, car vous utilisez le mot-clé function
. Vous devez utiliser des fonctions de grosse flèche pour obtenir ceci
dans une fonction. Votre code firebase
ressemblera à ceci firebase.auth (). OnAuthStateChanged ((user) => {if (user) {this.uid = user.uid; console.log (this. uid)}});
Vous devez d'abord comprendre la portée, chaque fois que vous déclarez une variable avec let à l'intérieur d'un bloc qui devient une portée de niveau bloc et n'est disponible qu'à l'intérieur de ce bloc, définissez des éléments à un niveau supérieur pour utiliser cette variable.
Il s'agit d'un problème de portée de fonction. Vous devez déclarer let uid
en dehors de la fonction de rappel.
Et, vous devez utiliser une fonction de flèche ou utilisez bind a > pour conserver cela dans le contexte de la fonction pour éviter Impossible de définir la propriété 'uid' d'un TypeError non défini: Impossible de définir la propriété 'uid' d'une erreur
non définie.
export class FooBatComponent implements OnInit { uid: number; ... addLink() { if (this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') { firebase.auth().onAuthStateChanged(user => { if (user) { this.uid = user.uid; console.log(this.uid) } }); console.log(this.uid); this.productService.addProduct(this.product); this.product = {} as Product; } }
OU
firebase.auth().onAuthStateChanged(function(user) { if (user) { this.uid = user.uid; console.log(this.uid) } }.bind(this));
En savoir plus sur mdn doc :
let vous permet de déclarer des variables qui sont limitées à la portée d'une instruction de bloc, ou d'une expression sur laquelle elle est utilisée
firebase.auth().onAuthStateChanged(user => { if (user) { this.uid = user.uid; console.log(this.uid) } });
vous devez utiliser la balise Angular ici
@BrunoCicerchia consultez stackoverflow.com/a/56996590/5042169 Cela résout TypeError: Impossible de définir la propriété 'uid' de undefined