欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Angular6 Filter实现页面搜索的示例代码

程序员文章站 2023-08-21 14:43:14
前言 我们在开发过程中经常会遇到在页面上实现全局搜索的需求,例如:表格搜索,通过关键词检索整个表格,过滤出我们需要的数据。在angular6 中我们可以通过filte...

前言

我们在开发过程中经常会遇到在页面上实现全局搜索的需求,例如:表格搜索,通过关键词检索整个表格,过滤出我们需要的数据。在angular6 中我们可以通过filter + pipe 的方式来实现这个功能。下面我们看一下实现代码。

经人提醒,代码排版太乱。后续考虑将一个完整版的demo放到github上,敬请期待。

实现代码

第一步

新建一个名为 filter.pipe.ts 的文件,这部分是实现的核心代码:

import { pipe, pipetransform } from '@angular/core';

@pipe({
 name: 'globalfilter'
})
export class globalfilterpipe implements pipetransform {
 transform(items: any, filter: any, defaultfilter: boolean): any {
 if (!filter){
 return items;
 }

 if (!array.isarray(items)){
 return items;
 }

 if (filter && array.isarray(items)) {
 let filterkeys = object.keys(filter);

 if (defaultfilter) {
 return items.filter(item =>
  filterkeys.reduce((x, keyname) =>
  (x && new regexp(filter[keyname], 'gmi').test(item[keyname])) || filter[keyname] == "", true));
 }
 else {
 return items.filter(item => {
  return filterkeys.some((keyname) => {
  return new regexp(filter[keyname], 'gmi').test(item[keyname]) || filter[keyname] == "";
  });
 });
 }
 }
 }
}

代码部分的正则表达式可以根据需要替换,这里是全局匹配。

第二步

在app.module.ts 文件中导入。

import { globalfilterpipe } from './shared/filter.pipe';

registerlocaledata(zh);

@ngmodule({
 declarations: [
 globalfilterpipe,
 ]

第三步

在需要的html 文件中应用,在 componet 中定义一个搜索框的变量。

<nz-input-group nzsearch nzsize="large" [nzsuffix]="suffixbutton">
 <input type="text" [(ngmodel)]="searchtext" nz-input placeholder="input search text">
</nz-input-group>
<ng-template #suffixbutton>
 <button nz-button nztype="primary" nzsize="large" nzsearch>search</button>
</ng-template>
<br>
<br>
<nz-card *ngfor="let topdata of topcategoriesdata" nztitle="{{topdata.categoryname}}">
 <div nz-card-grid [ngstyle]="gridstyle" *ngfor="let seconddata of topdata.subcategories | globalfilter: {categoryname: searchtext,categorycode: searchtext}" >
 
 <nz-collapse>
 <nz-collapse-panel [nzheader]="seconddata.categoryname+'('+seconddata.categorycode+')'" [nzactive]="false" [nzdisabled]="false">
 <nz-select style="width: 100%;" (nzopenchange)="loadmore(seconddata.categoryid)" nzplaceholder="请选择..." nzallowclear>
  <nz-option *ngfor="let thirddata of thirdcategoriesdata | globalfilter: {categoryname: searchtext,categorycode: searchtext}" [nzvalue]="thirddata.categoryid" [nzlabel]="thirddata.categoryname+'('+thirddata.categorycode+')'"></nz-option>
  <nz-option *ngif="isloading" nzdisabled nzcustomcontent>
  <i nz-icon type="loading" class="loading-icon"></i> loading data...
  </nz-option>
 </nz-select>
 </nz-collapse-panel>
 </nz-collapse>
 <!-- <a>{{seconddata.categoryname}}</a><b>({{seconddata.categorycode}})</b> -->
 </div>
 <ng-template #extratemplate>
 <a>二级分类数量:{{data.subcategories.length}}</a>
 </ng-template>
</nz-card>
import { component, oninit } from '@angular/core';
import { categoryservice } from '../category.service';

@component({
 selector: 'app-category',
 templateurl: '../pages/category.component.html',
 styleurls: ['../pages/category.component.css']
})
export class categorycomponent implements oninit {
 //todo 搜索无法由下至上匹配1,2级数据
 public searchtext:string;

 topcategoriesdata=[];
 
 thirdcategoriesdata=[];

 isloading = false;

 constructor(private categoryservice:categoryservice) { }
 loadmore(id): void {
 this.isloading = true;
 this.categoryservice.getthirdbyid(id).subscribe((data:any) => {
 this.isloading = false;
 this.thirdcategoriesdata=data;
 });
 }

 ngoninit():void {
 this.categoryservice.getcategoriestop().subscribe(
 (data:any)=>{
 this.topcategoriesdata = data;
 });
 }

}

关键代码是:globalfilter: {categoryname: searchtext,categorycode: searchtext}

其他代码都是为了完整而贴上去的。

结语

具体的实现思路是利用 filter + pipe 在数据集中进行过滤,因为这里直接过滤的是数据集。所以没办法单独设置过滤html,然后我遇到的问题是如果在一个包含有2级数据结构的html中应用的话,会从1级开始匹配,匹配到2级再结束。但如果1级未匹配到则2级不再匹配。例如:你的1级数据为:“医药品”,2级数据为“医药部外品”,“外用药品”。搜索词为:医药部,则不会显示任何结果。

最后,感谢阅读。本文如有不对的地方,还请指正。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。