angular 6 过滤异步管道结果
angular 6 filter the async pipe results
我使用 angular 6,我想过滤异步管道的结果,然后再将它们呈现在 UI.
这是我现在的代码
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name))
);
和模板
<div *ngIf='results | async ; let items'>
<div *ngFor='let item of items'>{{item.id}} {{item.name}} </div>
</div>
从管道中我得到了一些 ID 和名称。我已经有一个 id 数组。我想过滤管道的 ID,而不是渲染数组中已经存在的 ID。
所以,这就是我尝试做的事情。
array = [{id:1,name:'one'},{id:2,name:'two'}];//I already have this
管道中的新版本过滤器
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name)) ,
filter(checkIfResultIdInArray())//pseudocode
);
假设checkIfResultIdInArray
是我创建的函数。过滤并 returns 所有不在 array
中的 id。所以最终出现在模板中的 ids/names 不是 {id:1,name:'one'},{id:2,name:'two'}
.
或者我可以通过某种方式在模板中进行过滤?
如评论中所建议,您可以将 AsyncPipe
替换为常规数组,或更改发出值的值(@Davy 的解决方案很好)。
但是有一个基于模板的解决方案。我把它放在这里是为了那些不想将组件的逻辑与视图显示合并的人。
组件
result$ = of([1,2,3,4,5,6,7,8]); // for the sake of example
isAcceptedThing(thing){
return thing%2 != 0 // accept only odd numbers
}
模板
<ul >
<ng-container *ngFor="let thing of result$ | async">
<li *ngIf="isAcceptedThing(thing)">
filtered thing = {{ thing }}
</li>
</ng-container>
</ul>
输出
- filtered thing = 1
- filtered thing = 3
- filtered thing = 5
- filtered thing = 7
我想这就是你想要做的:
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name)) ,
map(names => names.filter(n => checkIfResultIdInArray(n)))
);
通常,在这样的设置中,我还会添加一个 debounceTime 运算符以防止请求过多。
@Davy 的回答是我自己会做的。然而,另一种选择是使用管道。如果您想重用此功能,这就是方法。
@Pipe({name:'filterOnId'})
export class FilterOnIdPipe implements PipeTransform {
transform(list : MyObject[], acceptedIds : number[]){
return list.filter(item => acceptedIds.indexOf(item.id) > -1);
}
}
并在模板中
<div *ngFor='let item of results | async | filterOnId : acceptedIds'>
{{item.id}} {{item.name}}
</div>
注意以下几点:
您可以像使用内置管道一样使用自定义管道。
您必须将管道包含在 AppModule 的声明数组中
如果您选择将管道注入 class,则必须在 NgModule 的提供者数组中提供它。
我使用 angular 6,我想过滤异步管道的结果,然后再将它们呈现在 UI.
这是我现在的代码
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name))
);
和模板
<div *ngIf='results | async ; let items'>
<div *ngFor='let item of items'>{{item.id}} {{item.name}} </div>
</div>
从管道中我得到了一些 ID 和名称。我已经有一个 id 数组。我想过滤管道的 ID,而不是渲染数组中已经存在的 ID。
所以,这就是我尝试做的事情。
array = [{id:1,name:'one'},{id:2,name:'two'}];//I already have this
管道中的新版本过滤器
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name)) ,
filter(checkIfResultIdInArray())//pseudocode
);
假设checkIfResultIdInArray
是我创建的函数。过滤并 returns 所有不在 array
中的 id。所以最终出现在模板中的 ids/names 不是 {id:1,name:'one'},{id:2,name:'two'}
.
或者我可以通过某种方式在模板中进行过滤?
如评论中所建议,您可以将 AsyncPipe
替换为常规数组,或更改发出值的值(@Davy 的解决方案很好)。
但是有一个基于模板的解决方案。我把它放在这里是为了那些不想将组件的逻辑与视图显示合并的人。
组件
result$ = of([1,2,3,4,5,6,7,8]); // for the sake of example
isAcceptedThing(thing){
return thing%2 != 0 // accept only odd numbers
}
模板
<ul >
<ng-container *ngFor="let thing of result$ | async">
<li *ngIf="isAcceptedThing(thing)">
filtered thing = {{ thing }}
</li>
</ng-container>
</ul>
输出
- filtered thing = 1
- filtered thing = 3
- filtered thing = 5
- filtered thing = 7
我想这就是你想要做的:
this.results = this.form.get('name').valueChanges.pipe(
filter(formdata => formdata.name.length > 0),
switchMap( formdata => this.service.getNames(formdata.name)) ,
map(names => names.filter(n => checkIfResultIdInArray(n)))
);
通常,在这样的设置中,我还会添加一个 debounceTime 运算符以防止请求过多。
@Davy 的回答是我自己会做的。然而,另一种选择是使用管道。如果您想重用此功能,这就是方法。
@Pipe({name:'filterOnId'})
export class FilterOnIdPipe implements PipeTransform {
transform(list : MyObject[], acceptedIds : number[]){
return list.filter(item => acceptedIds.indexOf(item.id) > -1);
}
}
并在模板中
<div *ngFor='let item of results | async | filterOnId : acceptedIds'>
{{item.id}} {{item.name}}
</div>
注意以下几点:
您可以像使用内置管道一样使用自定义管道。 您必须将管道包含在 AppModule 的声明数组中 如果您选择将管道注入 class,则必须在 NgModule 的提供者数组中提供它。