在Angular 2应用程序中迁移到服务层后逻辑不起作用

时间:2017-08-21 05:56:30

标签: javascript angular typescript

我的Angular 2应用程序中有一些功能,我想转移到服务层,因为目前有几个组件使用完全相同的功能(因此重复代码)。然而,到目前为止,当我将其移动到服务层时,我无法使功能正常工作。它直接从组件层调用时可以正常工作。

首先,这是我的组件中的功能。基本上我正在接受用户做出的一些过滤器选择,然后根据这些过滤器选择过滤我的可观察调用:

body: any = {'group': 'consulting'};

private processType(name: string, value: any, body: any)
    {
        if (this.body[name] && !value) {
                delete this.body[name];
            } else {
                this.body[name] = { $in: value };
            }
    }

    private onFilterReceived(value: any, type: string, body)
    {
        if (type === 'lan')
        {
            this.processType('languages.primary', value, body);
        } if (type === 'zip')
        {
            this.processType('addresses.zipCode', value, body);
        } 

        this.filtersService.getByFilter(this.page, this.pagesize, this.body, this.sort)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            this.data = resRecordsData.data;
            if (this.filter === undefined)
            {
                this.data = resRecordsData.data;
            } else
            this.data.sort(this.filter);
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
    }

以上所有工作都符合预期。

但是,如上所述,我想将此逻辑的初始部分移动到服务层,然后将结果传递给组件中的订阅。所以我试过的(目前不能正常工作)是这样的:

在服务层我有这个:

public processType(name: string, value: any, body: any)
{
    if (this.body[name] && !value) {
            return delete this.body[name];
        } else {
            return this.body[name] = { $in: value };
        }
}

public getFilterInput(value, type, body)
{
    if (type === 'lan')
    {
        return this.processType('languages.primary', value, body);
    } if (type === 'zip')
    {
        return this.processType('addresses.zipCode', value, body);
    } 

}

注意我在这里返回值,因为根据我的理解,这是抽象到服务层时我需要做的事情。

然后在组件中我重构了这个:

body: any = {'group': 'consulting'};

private processType(name, value, body)
{
    this.filtersService.processType(name, value, body);
}

private onFilterReceived(value: any, type: string, sort?)
{
    this.filtersService.getFilterInput(type, value);

    this.filtersService.getByFilter(this.page, this.pagesize, this.body, this.sort)
    .subscribe(resRecordsData => {
        this.records = resRecordsData;
        this.data = resRecordsData.data;
        if (this.filter === undefined)
        {
            this.data = resRecordsData.data;
        } else
        this.data.sort(this.filter);
    },
    responseRecordsError => this.errorMsg = responseRecordsError);
}

目前我在控制台中收到此错误:

  

内联模板:2:8引起:无法读取属性   未定义的'languages.primary'

我在这里缺少什么?将此逻辑移动到服务层时,如何以不同方式处理?

编辑:对我的代码进行编辑(如上所示)以传入“正文”。但是,仍然会出现未定义的错误。

1 个答案:

答案 0 :(得分:1)

this.body[name]正文在服务中不可用,因为langauges.primary未定义,您需要将正文传递给服务

<强>更新

public processType(name: string, value: any, body: any)
{
    let body = body;
    if (body[name] && !value) {
            return delete body[name];
        } else {
            return body[name] = { $in: value };
        }
}

然后在组件中,这个:

private processType(name, value)
{
    let body = {'group': 'consulting'};
    this.filtersService.processType(name, value, body);
}