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 相关文章推荐
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
全面解析Bootstrap表单使用方法(表单样式)
Nov 24 Javascript
Angular.js如何从PHP读取后台数据
Mar 24 Javascript
node.js实现快速截图
Aug 27 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
Bootstrap select多选下拉框实现代码
Dec 23 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
Dec 11 Javascript
webpack4 处理CSS的方法示例
Sep 03 Javascript
微信小程序整合使用富文本编辑器的方法详解
Apr 25 Javascript
如何从头实现一个node.js的koa框架
Jun 17 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
PHP 采集获取指定网址的内容
2010/01/05 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php学习之变量的使用
2011/05/29 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
Nginx实现反向代理
2017/09/20 Servers
PHP addslashes()函数讲解
2019/02/03 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
actionscript与javascript的区别
2011/05/25 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
python 以16进制打印输出的方法
2018/07/09 Python
详解Python 正则表达式模块
2018/11/05 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
入党积极分子个人总结
2015/03/02 职场文书
大队委员竞选稿
2015/11/20 职场文书
话题作文之成长
2019/12/09 职场文书