我有一个使用 getSomeData() 方法以角度声明的服务,在该方法中我从 json 收集数据,如下所示:
import { Injectable } from '@angular/core';
import {Http} from '@angular/http';
import { HttpModule } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import "rxjs/add/operator/map";
import "rxjs/add/operator/filter";
@Injectable()
export class GetDataService {
constructor(private http: Http) { }
getSomeData() {
return this.http.get("dataTable.json")
.map(res => res.json());
}
}
在组件中,我有一个变量data : any;
来绘制模板中的数据。
当使用像这样的普通javascript函数调用组件中的订阅服务时,它不会向我显示带有响应的数据。
ngOnInit():void {
this._service.getSomeData().subscribe(
function(response) { this.data = JSON.stringify(response) },
function(error) { console.log("Error happened" + error)},
function() { console.log("the subscription is completed")}
);
}
但是,如果我使用箭头函数调用 subscribe 方法,如果它绘制数据:
ngOnInit():void {
this._service.getSomeData().subscribe(
response=>{
this.data = JSON.stringify(response);
}
err=>{
console.log("Error happened" + error)
}
);
}
我认为这是一个异步问题,因为使用正常功能它没有时间绘制数据。
箭头函数和普通函数之间的区别在于上下文:在经典函数中,上下文是在调用它们时定义的,而在箭头函数中,它是在声明它们时定义的。没有什么比一个例子更清楚地看到它了:
解释:getA是一个普通的函数,所以如果作为函数调用,就是
this
调用的上下文,如果作为方法调用,this
就是方法所属的对象。相反,getB 是一个箭头函数,因此
this
它始终是声明它的上下文。在您的情况下,由于您的函数是在 context 是您的 class 时声明的
GetDataService
,它将this
指向 的实例GetDataService
,而传统函数 this 将是 observable 的上下文,因此this.data
无法分配它,因为它不存在。如何使“经典”功能在这种情况下工作?有两种解决方案: