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


Posted in Javascript onDecember 02, 2018

前言

我们在开发过程中经常会遇到在页面上实现全局搜索的需求,例如:表格搜索,通过关键词检索整个表格,过滤出我们需要的数据。在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级数据为“医药部外品”,“外用药品”。搜索词为:医药部,则不会显示任何结果。

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

Javascript 相关文章推荐
dwr spring的集成实现代码
Mar 22 Javascript
js事件冒泡实例分享(已测试)
Apr 23 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
JavaScript操作Cookie方法实例分析
May 27 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
基于pako.js实现gzip的压缩和解压功能示例
Jun 13 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
Sep 04 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
Sep 15 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
May 23 Javascript
微信小程序修改数组长度的问题的解决
Dec 17 Javascript
vue 微信扫码登录(自定义样式)
Jan 06 Javascript
GOJS+VUE实现流程图效果
Dec 01 #Javascript
JavaScript实现简单轮播图效果
Dec 01 #Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 #jQuery
jquery拖拽自动排序插件使用方法详解
Jul 20 #jQuery
vue实现移动端悬浮窗效果
Dec 01 #Javascript
vue拖拽组件使用方法详解
Dec 01 #Javascript
vue实现div拖拽互换位置
Jul 29 #Javascript
You might like
截获网站title标签之家内容的例子
2006/10/09 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
jquery中动态效果小结
2010/12/16 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
详解python中asyncio模块
2018/03/03 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
如何利用python进行时间序列分析
2020/08/04 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
团日活动策划书
2014/02/01 职场文书
学校卫生检查制度
2014/02/03 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
社会实践活动总结报告
2014/04/29 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2014年除四害工作总结
2014/12/06 职场文书
前台接待岗位职责
2015/02/03 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书