1
votes

Comment exporter la variable d'une fonction en angulaire?

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'.


2 commentaires

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


5 Réponses :


0
votes

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;
}


3 commentaires

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



0
votes

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;
    }
  }


1 commentaires

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



0
votes

5 commentaires

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)}});



0
votes

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.


0 commentaires

0
votes

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)  
  }
});  


0 commentaires