Javascript TypeScript,Angular 1.x:lambda函数如何影响属性分辨率?

Javascript TypeScript,Angular 1.x:lambda函数如何影响属性分辨率?,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,编辑: 我能够解决这个问题,但我不知道为什么。所以,我修改了这个问题,以反映我现在的立场。我把老问题留作参考 新问题: 将lambda函数更改为旧式函数修复了TS编译器无法在$state上找到属性的问题。我不知道为什么会这样。所以,我现在的问题是 lambda函数如何影响属性解析?和.. 我如何确定何时使用lambda与旧式函数? 通过还原为旧式函数修复了属性解析: 旧问题如下: 标题:TypeScript,Angular 1.x:$state.go不存在——但它在同一文件的其他地方存在 我正

编辑:

我能够解决这个问题,但我不知道为什么。所以,我修改了这个问题,以反映我现在的立场。我把老问题留作参考

新问题:

将lambda函数更改为旧式函数修复了TS编译器无法在
$state
上找到属性的问题。我不知道为什么会这样。所以,我现在的问题是

lambda函数如何影响属性解析?和..

我如何确定何时使用lambda与旧式函数?

通过还原为旧式函数修复了属性解析:

旧问题如下:

标题:TypeScript,Angular 1.x:$state.go不存在——但它在同一文件的其他地方存在

我正在将Angular 1.5应用程序从vanilla JS转换为TypeScript。我遇到了一个奇怪的问题,
$state
上的方法
go
存在,并且不存在于同一个类中

(在下图中可能很难看到,但请注意,在第二个
this.$state.go
go
中有一条红色下划线,因为编译器认为该属性不存在)

下面是完整的课程:

export class LogoutAndInfoController implements ILogoutAndInfo {
    public memberInfo: Object;
    static $inject = [
        '$http', '$state', 'AuthService', 'API_ENDPOINT', 'UserInfoService'
    ];

    constructor(private $http: angular.IHttpService, private $state: angular.ui.IStateProvider,
    private AuthService: AuthService, private API_ENDPOINT: IAPI_ENDPOINT, private UserInfoService: UserInfoService) {
        this.memberInfo = {};
    }

    destroySession(): void {
        this.AuthService.logout();
    }

    getInfo(): void {
        this.$http.get(this.API_ENDPOINT["url"] + '/memberinfo').then(function (result) {
            this.memberInfo = result.data["user"];
            this.$state.go('login');
        });
    }

    logout(): void {
        this.AuthService.logout().then((result: any) => {
            this.UserInfoService.resetUser();
            this.$state.go('login');
        });
    }
}

我对角度框架内的TS和TS都很陌生。所以,请让我知道在我们调试之前是否还有其他代码需要查看。

这实际上是因为与您可能使用的大多数其他语言相比,
在Javascript中的表现……很奇怪

在第一个示例中,调用
$http.get()
。由于
this
在JS中的工作方式,将调用
get()
函数,并将
this
设置为
this的任何值。$http
就是这种情况。不过,这正是时髦开始的地方
仅在对对象调用方法时设置,在调用新函数时保持不变。这意味着当
$http.get()
调用回调时,
仍设置为
$http
,因此
$state
不存在

这就是为什么您会看到
var self=This的模式到处都是。它允许您绑定到您所知道的
,因此以下功能可以正常工作:

var self = this;
this.$http.get(..., function() {
    self.$state.go()
});
另一方面,Lambda函数的绑定方式不同。所谓的“箭头函数”没有自己的
this
上下文,因此在创建它们的函数中关闭了
this
,因此它们可以按预期工作

其他资料来源:


这实际上是由于
这个
在Javascript中的表现……与您可能使用的大多数其他语言相比,非常奇怪

在第一个示例中,调用
$http.get()
。由于
this
在JS中的工作方式,将调用
get()
函数,并将
this
设置为
this的任何值。$http
就是这种情况。不过,这正是时髦开始的地方
仅在对对象调用方法时设置,在调用新函数时保持不变。这意味着当
$http.get()
调用回调时,
仍设置为
$http
,因此
$state
不存在

这就是为什么您会看到
var self=This的模式到处都是。它允许您绑定到您所知道的
,因此以下功能可以正常工作:

var self = this;
this.$http.get(..., function() {
    self.$state.go()
});
另一方面,Lambda函数的绑定方式不同。所谓的“箭头函数”没有自己的
this
上下文,因此在创建它们的函数中关闭了
this
,因此它们可以按预期工作

其他资料来源: