Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度7分量可观测命名vs匿名函数_Angular_Typescript_Callback_Observable_Angular7 - Fatal编程技术网

Angular 角度7分量可观测命名vs匿名函数

Angular 角度7分量可观测命名vs匿名函数,angular,typescript,callback,observable,angular7,Angular,Typescript,Callback,Observable,Angular7,我已经创建了一个Angular 7组件,它可以从角度服务中观察到。我正在使用它将远程服务中的数据绑定到我的一个页面上的列表。它工作得很好。然而,我注意到的一件事是,在subscribe异步回调中,如果使用命名函数而不是匿名函数,则数据不会绑定到页面上的列表 下面是当前匿名回调的一个示例,它可以正常工作 public constructor(private vendorApiService: VendorApiService, private eventMessagingService:

我已经创建了一个Angular 7组件,它可以从角度服务中观察到。我正在使用它将远程服务中的数据绑定到我的一个页面上的列表。它工作得很好。然而,我注意到的一件事是,在subscribe异步回调中,如果使用命名函数而不是匿名函数,则数据不会绑定到页面上的列表

下面是当前匿名回调的一个示例,它可以正常工作

public constructor(private vendorApiService: VendorApiService,
    private eventMessagingService: EventMessagingService) {

    this.vendorApiService.getVendors().subscribe(
      (data) => {
        this._vendor = data;
        this.dataSource = new MatTableDataSource<Vendor>(this._vendor);
        this.dataSource.paginator = this.paginator;
      });
    this._displayedColumns = ['id', 'code', 'name', 'edit'];
}
公共构造函数(私有供应商服务:供应商服务,
私有eventMessagingService:eventMessagingService){
此.vendorApiService.getVendors().subscribe(
(数据)=>{
这是。_供应商=数据;
this.dataSource=新MatTableDataSource(此.\u供应商);
this.dataSource.paginator=this.paginator;
});
这._displayedColumns=['id','code','name','edit'];
}
我想把它转换成这个。但是,这不起作用:

public constructor(private vendorApiService: VendorApiService,
  private eventMessagingService: EventMessagingService) {

    this.vendorApiService.getVendors().subscribe(
      this.setup_vendor_list);
    this._displayedColumns = ['id', 'code', 'name', 'edit'];
}

private setup_vendor_list(data) {
  this._vendor = data;
  this.dataSource = new MatTableDataSource<Vendor>(this._vendor);
  this.dataSource.paginator = this.paginator;
}
公共构造函数(私有供应商服务:供应商服务,
私有eventMessagingService:eventMessagingService){
此.vendorApiService.getVendors().subscribe(
此设置(供应商列表);
这._displayedColumns=['id','code','name','edit'];
}
私人设置\u供应商\u列表(数据){
这是。_供应商=数据;
this.dataSource=新MatTableDataSource(此.\u供应商);
this.dataSource.paginator=this.paginator;
}
根据我对Javascript的了解,这应该是可行的。但是,由于这是typescript,可能有一些我不知道的特殊情况会影响命名和匿名回调的处理方式


如果你能解释两者的区别,请这样做。

这不是关于TypeScript的,它仍然是纯JavaScript的问题。作为参数传递
this.setup\u vendor\u list
与传递相同

function (...args) { return this.setup_vendor_list(...args) },
这和

(...args) => this.setup_vendor_list(...args),
你似乎相信

它也不是关于命名与匿名函数:注意我的两个示例都是匿名的。但是,只有一个是箭头函数

影响您的不同之处在于,在这些函数中解决
this
的方法,您可以在中阅读更多信息


两个最快的解决方法:

subscribe(this.setup_vendor_list.bind(this))
subscribe(data => this._setup_vendor_list(data))

在第二个场景中,您得到了什么?添加一个
控制台.log
,并尝试在您的函数中记录
。箭头函数不会更改
的值,但命名函数会更改。这可能就是它不起作用的原因。但是,您可以传递一个调用您的函数的箭头函数,如
(数据)=>setup\u vendor\u list(数据)
。是的,关于“这一点”您是正确的。我应该意识到这一点。我有时会忘记“这个”上下文。谢谢你的帮助。