Angularjs 为什么我必须在typescript角度控制器函数中重新声明属性

Angularjs 为什么我必须在typescript角度控制器函数中重新声明属性,angularjs,typescript,Angularjs,Typescript,上面的代码相当标准。我的问题是,当我想在函数中访问foo:string时,我必须这样做 export interface IFooModel { foo:string; fooFunction(fooProp:string):void; } export class FooCtrl implements IFooModel { constructor(public foo:string){ } fooFunction(fooProp:string):

上面的代码相当标准。我的问题是,当我想在函数中访问
foo:string
时,我必须这样做

export interface IFooModel {
    foo:string;
    fooFunction(fooProp:string):void;
}

 export class FooCtrl implements IFooModel {
    constructor(public foo:string){
    }

    fooFunction(fooProp:string):void{
    }
}

为什么我必须将
this.foo
设置为一个变量才能在另一个函数中访问它,而不是只写
this.foo
?在一些函数中,我最终得到了构造函数中已经声明的大约4个变量声明。有没有更好的办法?我感觉控制器中有太多重复代码。

在调用函数之前将值放入局部变量中的唯一原因是,您希望类超出范围(即,范围会发生变化,例如回调或异步操作)

通过将值放入局部变量,它将成为函数闭包的一部分,并且该值将与函数本身一起存储

这是JavaScript最棘手的方面之一——作用域有点古怪

还有其他方法可以解决这个问题,包括胖箭头

fooFunction(fooProp:string):void{
   var fooAgain = this.foo;

  // Pretend i set it up properly for $mdDialog to work
  this.$mdDialog.show(options).then(function(answer: boolean) {
       if (answer) {
             // fooAgain works
             // this.foo does not work 
       }
}

调用
/
应用
,这允许您设置范围。

在调用函数之前将值放入局部变量的唯一原因是,您希望类超出范围(即,可能会发生某些事情来更改范围,例如回调或异步操作)

通过将值放入局部变量,它将成为函数闭包的一部分,并且该值将与函数本身一起存储

这是JavaScript最棘手的方面之一——作用域有点古怪

还有其他方法可以解决这个问题,包括胖箭头

fooFunction(fooProp:string):void{
   var fooAgain = this.foo;

  // Pretend i set it up properly for $mdDialog to work
  this.$mdDialog.show(options).then(function(answer: boolean) {
       if (answer) {
             // fooAgain works
             // this.foo does not work 
       }
}

或者
调用
/
应用
,这允许您设置范围。

是的,这在Javascript中是一个问题,但幸运的是在TypeScript中,这个问题不再多亏胖箭头!耶

胖箭头类似于匿名函数,但可以为您处理
这个
变量。
让我告诉你:

() => {
    // this.foo is now preserved
}
使用fat箭头,现在将在JS中编译为:

fooFunction(fooProp:string):void {
    // Pretend i set it up properly for $mdDialog to work
    this.$mdDialog.show(options).then((answer: boolean) => {
        if (answer) {
            this.foo = "";  
        }
     });
}
因此,Typescript会自动为您创建一个
\u这个
变量,这样您就不会再有问题了。如果你问我的话,那就相当不错了

以下是箭头函数的文档:

是的,这在Javascript中是一个问题,但谢天谢地,在TypeScript中,这个问题不再多亏胖箭头!耶

胖箭头类似于匿名函数,但可以为您处理
这个
变量。
让我告诉你:

() => {
    // this.foo is now preserved
}
使用fat箭头,现在将在JS中编译为:

fooFunction(fooProp:string):void {
    // Pretend i set it up properly for $mdDialog to work
    this.$mdDialog.show(options).then((answer: boolean) => {
        if (answer) {
            this.foo = "";  
        }
     });
}
因此,Typescript会自动为您创建一个
\u这个
变量,这样您就不会再有问题了。如果你问我的话,那就相当不错了

以下是箭头函数的文档:

你是想在方法中声明函数吗?我更新了我的问题,希望它更有意义,我当时正陷入一个愚蠢的境地。是的,我现在明白了,
这是Javascript中的一个已知问题。你是想在方法中声明函数吗?我更新了我的问题,希望它更有意义,我当时正在往那里钻一个洞啊,是的,我现在明白了,
这在Javascript中是一个众所周知的问题。我知道,所以我们必须避免说谢谢。。但是谢谢,没问题!这些事情令人沮丧。我知道,所以我们不能说谢谢。。但是谢谢,没问题!这些事情令人沮丧。我知道,所以我们不能说谢谢。。但是4.我知道,所以说我们不能说谢谢。。但是谢谢