我有一个在ngOnInit方法中有以下几行的组件
this.businessTypesService.get()
.subscribe((businessTypes: string[]) => {
_.each(businessTypes,
(businessType: string) => {
this.businessTypes.push({ label: businessType, value: businessType });
});
});
现在我有相同类型的块10次,每次加载不同的选项下拉列表。除了它调用哪个服务以及将结果推入哪个数组之外,每个都是相同的,所以我想将它重构为单个方法,以便我可以将代码更改为类似的内容。
this.loadReferenceList(this.businessTypesService.get, this.businessTypes);
,新的loadReferenceList方法如下所示
loadReferenceList(loadMethod: () => Observable<string[]>, lookupList: SelectItem[]): any {
loadMethod()
.subscribe(((items: string[]) => {
_.each(items,
(item: string) => {
lookupList.push({ label: item, value: item });
});
}));
}
每个服务类看起来都是这样的
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
@Injectable()
export class BusinessUnitsService {
get(): Observable<string[]> {
return Observable.of(this.getData());
}
constructor(private readonly http: Http) { }
getData(): string[] {
return [
'Beverage',
'Food',
'Beverage & Food',
'Promo Pack'
];
}
}
现在它只是硬编码数据,但会更改为使用Http以便稍后降低实际值。
问题是this.getdata()行没有说明这是未定义的。我不明白为什么当我改变这种情况时,这将是未定义的。
********回答************ 我根据下面的答案进行了以下更改以使其工作 loadReferenceList方法已更改为如下所示。基本上为服务添加了一个参数,这样我就可以引用它应该是什么,然后添加.bind方法来给出方法范围。
loadReferenceList(loadMethod: () => Observable<string[]>, service: any, lookupList: SelectItem[]): any {
const method = loadMethod.bind(service);
method()
.subscribe(((items: string[]) => {
_.each(items,
(item: string) => {
lookupList.push({ label: item, value: item });
});
}));
}
答案 0 :(得分:1)
您需要将.get()绑定到您的对象,即
loadReferenceList(this.businessTypesService.get.bind(this.businessTypesServices), ...)
或者您需要为所有服务定义抽象接口并按原样传递对象
loadReferenceList(service: AbstractService, ...) {
service.get()
}
您的所有服务都需要实现此接口
答案 1 :(得分:0)
I made a live simple version of what you're doing。
我在使用Observable.of(...)时遇到了问题。当我使用Observable.create(...)和new Observable(...)时,它工作。
几乎任何与rxjs有关的事情,我都会使用这样的plunkr进行测试。如果有帮助,请告诉我?