我的问题与这些问题非常相似,但我没有解决我的问题;
cannot access to this of component in subscribe function
'this' scope in typescript callback function
Cannot Access Component Variables in Subscribe when using chrome inspector
unable to get component variables inside a RxJS subscribe() function
这是我的打字稿组件类:
export class Test{
x: string;
}
export class TestComponent implements OnInit{
test: Test;
constructor(private testService: TestService){}
ngOnInit(){
this.testService.getTest()
.subscribe((res) => { this.test = res.test;}, ...);
console.log(this.text.x) //it becomes undefined
}
}
我正在使用gulp-typescript,输出就像这些;
//when targeting es6
let testComponent = class TestComponent ... {
constructor(testService){
this.testService = testService;
}
ngOnInit(){
this.testService.getTest()
.subscribe((res) => {this.test = res.test;}, ...);
console.log(this.text.x)
}
}
//when targeting es5
var TestComponent = (function(){
function TestComponent(testService){
this.testService = testService;
}
TestComponent.prototype.ngOnInit = function(){
var _this = this;
this.testService.getTest()
.subscribe(function (res) { _this.test = res.test }, ...);
console.log(this.text.x)
}
}())
当我想尝试达到' this.test.x'我从两个输出的浏览器中得到以下错误;
EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'x' of undefined
当我记录this.test
时,它是undefined
。我的TestService被正确注入,请求来到我的api,res.test
包括我需要但我无法使用this.test
,因为它总是未定义的。我不知道我在哪里做错了。有没有其他人可以帮助我?最后,我想问一下,在考虑浏览器兼容性等时,我应该考虑哪一个,es5或es6?
答案 0 :(得分:3)
将console.log
语句移到箭头函数内。
ngOnInit(){
this.testService.getTest()
.subscribe((res) => {
this.test = res.test;
console.log(this.text.x)
}, ...);
}
如果你想对this.test
做其他事情,那么你也必须将它们移到里面(或者,添加另一个函数并从回调中调用它)。基本上,如果您有一个返回Observable
的服务,这意味着回调将不会在相同的"框架中运行"你调用了这个函数。在您的原始代码中,这是操作的顺序:
subscribe(() =>
回调。 this.test
已设置。答案 1 :(得分:0)
您可以仅将函数TestComponent.prototype.ngOnInit替换为Arrow函数,这样从您的订阅调用中就可以访问“ this”。