我的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'
我在这里缺少什么?将此逻辑移动到服务层时,如何以不同方式处理?
编辑:对我的代码进行编辑(如上所示)以传入“正文”。但是,仍然会出现未定义的错误。
答案 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);
}