如何从Angular函数中导出变量?

时间:2019-07-11 19:23:26

标签: javascript node.js typescript firebase firebase-authentication

当我在函数内部定义变量时,不能在外部使用它。

我试图在NgOnInit内定义一个变量,但它也不起作用。

我的代码:

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

我得到的错误:

  

TS2304:找不到名称'uid'。

5 个答案:

答案 0 :(得分:0)

这是因为声明为df_before_target = df.truncate(before=target_date) df_after_target = df.truncate(after=target_date) len_b4 = len(df_before_target ) - 1 # substracting 1 to account for double counting of target_date in the truncated dfs. len_a4 = len(df_after_target ) df.insert(0, 'day', range(-len_b4, -len_a4 + len(df))) 的变量的范围受到它们定义的块的限制,要使用它,您只需在函数范围之外声明它即可。

let

}

答案 1 :(得分:0)

上面的代码可以正常工作。函数内部带有“ let”只是暂时的。而是在声明类后立即创建变量:

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

答案 2 :(得分:0)

这是因为uid是一个块范围变量。您可以从here了解有关变量作用域的更多信息。另外,您可以在代码中进行以下更改,以使uid条件之外的if

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

答案 3 :(得分:0)

首先需要了解作用域的内容,每当在一个成为块级作用域且仅在该块内可用的块中声明let的变量时,在更高级别的作用域中定义事物以使用该变量。

答案 4 :(得分:0)

这是一个功能范围问题。您必须在回调函数之外声明let uid

而且,您需要使用arrow function或使用bind将其保留在函数上下文中,以防止发生Cannot set property 'uid' of undefined TypeError: Cannot set property 'uid' of undefined错误。

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    this.uid = user.uid;
    console.log(this.uid)  
  }
});  

OR

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    this.uid = user.uid;
    console.log(this.uid)  
  }
}.bind(this)); 

有关mdn doc的更多信息:

  

let允许您声明仅限于语句块或使用它的表达式范围的变量

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