如何根据对象属性字符串过滤“ngFor”循环内的项目

2024-07-04

我需要过滤里面的项目ngFor循环,通过更改下拉列表中的类别。因此,当从列表中选择特定类别时,它应该只列出包含该相同类别的项目。

HTML 模板:

<select>
  <option *ngFor="let model of models">{{model.category}}</option>
</select>

<ul class="models">
  <li *ngFor="let model of models" (click)="gotoDetail(model)">
  <img [src]="model.image"/>
  {{model.name}},{{model.category}}
  </li>
</ul>

项目数组:

export var MODELS: Model[] = [
{ id: 1, 
  name: 'Model 1', 
  image: 'img1', 
  category: 'Cat1', 
},

{ id: 2, 
  name: 'Model 2', 
  image: 'img2', 
  category: 'Cat3',
},

{ id: 3, 
  name: 'Model 3', 
  image: 'img3', 
  category: 'Cat1',
},
{ id: 4, 
  name: 'Model 4', 
  image: 'img4', 
  category: 'Cat4',
},

...
];

此外,下拉列表包含重复的类别名称。它有必要仅列出唯一的类别(字符串)。

我知道创建自定义管道是执行此操作的正确方法,但我不知道如何编写。

笨蛋:http://plnkr.co/edit/tpl:2GZg5pLaPWKrsD2JRted?p=preview http://plnkr.co/edit/tpl:2GZg5pLaPWKrsD2JRted?p=preview


这是一个示例管道:

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(...))。不过,您需要首先将其映射到字符串(类别)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据对象属性字符串过滤“ngFor”循环内的项目 的相关文章

随机推荐