这是一个示例管道:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'matchesCategory'
})
export class MathcesCategoryPipe implements PipeTransform {
transform(items: Array<any>, category: string): Array<any> {
return items.filter(item => item.category === category);
}
}
使用方法:
<li *ngFor="let model; of models | matchesCategory:model.category" (click)="gotoDetail(model)">
===== plunkr 示例 ====
您需要您的选择更改才能反映在某些变量中
首先在你的类中定义一个成员:
selectedCategory: string;
然后更新你的模板:
<select (change)="selectedCategory = $event.target.value">
<option *ngFor="let model of models ">{{model.category}}</option>
</select>
最后,使用管道:
<li *ngFor="let model; of models | matchesCategory:selectedCategory" (click)="gotoDetail(model)">
====看到骗子后的评论====
我注意到你使用了 Promise。 Angular2 更面向 rxjs。所以我要改变的第一件事是在你的服务中,替换:
getModels(): Promise<Model[]> {
return Promise.resolve(MODELS);
}
to:
getModels(): Observable<Array<Model>> {
return Promise.resolve(MODELS);
}
and
getModels(id: number): Observable<Model> {
return getModels().map(models => models.find(model.id === id);
}
然后在你的ModelsComponent
models$: Observable<Array<Model>> = svc.getModels();
uniqueCategories$: Observable<Array<Model>> = this.models$
.map(models => models.map(model => model.category)
.map(categories => Array.from(new Set(categories)));
你的选择将变成:
<option *ngFor="let category; of uniqueCategories$ | async">{{model.category}}</option>
和你的清单:
<li *ngFor="let model; of models$ | async | matchesCategory:selectedCategory" (click)="gotoDetail(model)">
这是一个非常草率的解决方案,因为您有很多重复项并且您不断查询服务。以此为起点,仅查询服务一次,然后从获得的结果中得出特定值。
如果您想保留代码,只需实现一个 UniqueValuesPipe,它的转换将获取一个参数并使用以下方法对其进行过滤以返回唯一类别Array.from(new Set(...))
。不过,您需要首先将其映射到字符串(类别)。