这个运算符未定义有什么问题

时间:2017-03-31 14:05:20

标签: javascript angular

我有一个在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 });
                });
        }));
}

2 个答案:

答案 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进行测试。如果有帮助,请告诉我?