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 相关文章推荐
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
node.js中express-session配置项详解
May 31 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
Vue动画事件详解及过渡动画实例
Feb 09 Javascript
微信小程序图片自适应实现解析
Jan 21 Javascript
Vue实现移动端拖拽交换位置
Jul 29 Javascript
如何利用vue实现波谱拟合详解
Nov 05 Javascript
解决vue初始化项目一直停在downloading template的问题
Nov 09 Javascript
vue动态绑定style样式
Apr 20 Vue.js
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
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
一段实时更新的时间代码
2006/07/07 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
Python3.5运算符操作实例详解
2019/04/25 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
详解python变量与数据类型
2020/08/25 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
护士个人年终总结
2015/02/13 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫