Javascript 在Angular 2中,如何调用承诺中的类方法?

Javascript 在Angular 2中,如何调用承诺中的类方法?,javascript,angular,promise,Javascript,Angular,Promise,如果我有一个Angular 2组件,并且我从一个返回异步承诺或可观察的服务获取数据,那么我如何调用组件中的方法来显示该数据 @Component({ moduleId: module.id, selector: 'charts', templateUrl: 'charts.component.html', providers: [DataService] }) export class ChartsComponent implements OnInit { construc

如果我有一个Angular 2组件,并且我从一个返回异步承诺或可观察的服务获取数据,那么我如何调用组件中的方法来显示该数据

@Component({
  moduleId: module.id,
  selector: 'charts',
  templateUrl: 'charts.component.html',
  providers: [DataService]
})
export class ChartsComponent implements OnInit {

  constructor(private dataService:DataService)

  ngOnInit() {
    this.getData();
  }

  getData(){
    this.dataService.getData().then(function (data) {
      this.drawChart(data);
    });
  }

  drawChart(){
     //implement drawing chart
  }
}
问题是在“this.drawChart()”中的承诺“this”中不再引用ChartsComponent类。如何调用类方法post promise

另外,我不能将drawChart()放在promise中,因为它需要使用其他类属性。

使用时,会保留
this

getData(){
  this.dataService.getData().then((data) => { // <-- changed here
    this.drawChart(data);
  });
}
getData(){
this.dataService.getData()。然后((data)=>{/有两种解决方案:

1) 使用“自我”:

}

2) 使用“绑定方法”(或类似方法):

您可以找到有关此方法的大量信息,例如:


我更喜欢第一种解决方案,因为它有助于使代码更加透明。

谢谢!您帮我省去了很多麻烦。这很好,虽然在我的IDE中留下了语法错误,但还是需要升级工具了。@Paul Arrow函数是一种新语法,在JS的ES6版本中提供。您的IDE可能支持它,但可能需要配置。@acdcjunior在IE11中出现故障-我最初在中测试chrome@Paul是的,IE11不支持它。您必须使用babel或其他工具来传输它。如果IE11需要它,但无法传输,我建议使用类似
this.dataService.getData()。然后(函数(数据){this.drawChart(数据);}.bind(this));
谢谢,我正在使用第一种解决方案。
     var self = this;
     ngOnInit() {
        self.getData();
     }

     getData(){
        self.dataService.getData().then(function (data) {
        self.drawChart(data);
     });
.then(function (data) {
        this.drawChart(data);
     }).bind(this)