ES6 + Angular控制器类,在回调中没有定义
ES6 + Angular Controller class, getting this is undefined in callback
考虑以下类
class LoginController{
constructor(authService,$timeout,$state){
let vm = this;
this.loading = false;
this._authService = authService;
this._$timeout = $timeout;
this._$state = $state;
this.loading = false;
this.statusMessage = null;
}
login(){
this.loading = true;
this.statusMessage = null;
let loginModel = {
UserName : this.username,
Password : this.password,
RememberMe : this.rememberMe
};
//Login User
this._authService.login(loginModel).then(function(user){
//Set User Login & send to Dashboard
this._authService.setUser(user);
this._$state.go("dashboard");
}, function(error){
const errorMessage = error ? error.Message : "Undefined Login Issue occurred !";
this.loading = false;
});
}
}
一切都很好,除了然后我击中错误回调函数,它得到this.loading = false;
,由于某种原因,这是未定义的。
如何在错误回调中保留对类"this"的引用?
您必须使用胖箭头来保持范围。
//Login User
this._authService.login(loginModel).then((user) => {
//Set User Login & send to Dashboard
this._authService.setUser(user);
this._$state.go("dashboard");
}, (error) => {
const errorMessage = error ? error.Message : "Undefined Login Issue occurred !";
this.loading = false;
});
将上下文传递给回调函数是一个非常常见的问题。一般的答案是声明像
这样的东西 var self=this;
在您想要保留"this"的上下文中然后在回调函数中引用它,像这样
function callback () {
self.myvariable=true;
};
在你的特殊情况下,你已经声明了let vm = this;
所以你可以用vm._authService.setUser(user);
vm._$state.go("dashboard");
function(error){
this.loading = false;
}
函数内部的this是一个不同的作用域,因此this指的是该函数而不是父函数。
解决方案,
定义self:
class LoginController{
constructor(authService,$timeout,$state){
let vm = this;
this.loading = false;
this._authService = authService;
this._$timeout = $timeout;
this._$state = $state;
this.loading = false;
this.statusMessage = null;
}
login(){
var self = this; //Define this as self
this.loading = true;
this.statusMessage = null;
let loginModel = {
UserName : this.username,
Password : this.password,
RememberMe : this.rememberMe
};
//Login User
this._authService.login(loginModel).then(function(user){
//Set User Login & send to Dashboard
self._authService.setUser(user);
self._$state.go("dashboard");
}, function(error){
const errorMessage = error ? error.Message : "Undefined Login Issue occurred !";
self.loading = false; //Self refers to this of parent scope
});
}
}
相关文章:
- 要求未定义JS回调参数
- Dojo AMD加载程序执行定义具有空/缺失依赖项的回调
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- 注册后是否可以定义HTML5自定义元素中的生命周期回调
- dalek回调或自定义函数
- 如何使用另一个 JavaScript 文件中定义的类名调用回调函数
- 节点.js + Express - 在完成之前返回未定义的回调
- 要求多页&多应用程序未执行定义回调
- 为从AJAX调用中utlizes DATA参数的函数定义回调
- 自定义Cordova插件,释放一个保持回调而不调用它
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 如何定义finish render ngRepeat并运行回调
- 如何向jquery插件添加自定义回调
- jQuery插件的自定义事件与回调
- 如何在javascript中对用户函数进行自定义回调
- TypeError:这个_在Dojo FilteringSelect-onChange回调中未定义url
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- 自定义回调护照
- 在 JavaScript 中为所有事件类型定义回调函数
- AngularJS:回调定义正确