经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AngularJS » 查看文章
Angular6 Filter实现页面搜索的示例代码
来源:jb51  时间:2018/12/3 14:32:39  对本文有异议

前言

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

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

实现代码

第一步

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

  1. import { Pipe, PipeTransform } from '@angular/core';
  2.  
  3. @Pipe({
  4. name: 'globalFilter'
  5. })
  6. export class GlobalFilterPipe implements PipeTransform {
  7. transform(items: any, filter: any, defaultFilter: boolean): any {
  8. if (!filter){
  9. return items;
  10. }
  11.  
  12. if (!Array.isArray(items)){
  13. return items;
  14. }
  15.  
  16. if (filter && Array.isArray(items)) {
  17. let filterKeys = Object.keys(filter);
  18.  
  19. if (defaultFilter) {
  20. return items.filter(item =>
  21. filterKeys.reduce((x, keyName) =>
  22. (x && new RegExp(filter[keyName], 'gmi').test(item[keyName])) || filter[keyName] == "", true));
  23. }
  24. else {
  25. return items.filter(item => {
  26. return filterKeys.some((keyName) => {
  27. return new RegExp(filter[keyName], 'gmi').test(item[keyName]) || filter[keyName] == "";
  28. });
  29. });
  30. }
  31. }
  32. }
  33. }

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

第二步

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

  1. import { GlobalFilterPipe } from './shared/filter.pipe';
  2.  
  3. registerLocaleData(zh);
  4.  
  5. @NgModule({
  6. declarations: [
  7. GlobalFilterPipe,
  8. ]

第三步

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

  1. <nz-input-group nzSearch nzSize="large" [nzSuffix]="suffixButton">
  2. <input type="text" [(ngModel)]="searchText" nz-input placeholder="input search text">
  3. </nz-input-group>
  4. <ng-template #suffixButton>
  5. <button nz-button nzType="primary" nzSize="large" nzSearch>Search</button>
  6. </ng-template>
  7. <br>
  8. <br>
  9. <nz-card *ngFor="let topData of topCategoriesData" nzTitle="{{topData.categoryName}}">
  10. <div nz-card-grid [ngStyle]="gridStyle" *ngFor="let secondData of topData.subCategories | globalFilter: {categoryName: searchText,categoryCode: searchText}" >
  11. <nz-collapse>
  12. <nz-collapse-panel [nzHeader]="secondData.categoryName+'('+secondData.categoryCode+')'" [nzActive]="false" [nzDisabled]="false">
  13. <nz-select style="width: 100%;" (nzOpenChange)="loadMore(secondData.categoryId)" nzPlaceHolder="请选择..." nzAllowClear>
  14. <nz-option *ngFor="let thirdData of thirdCategoriesData | globalFilter: {categoryName: searchText,categoryCode: searchText}" [nzValue]="thirdData.categoryId" [nzLabel]="thirdData.categoryName+'('+thirdData.categoryCode+')'"></nz-option>
  15. <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
  16. <i nz-icon type="loading" class="loading-icon"></i> Loading Data...
  17. </nz-option>
  18. </nz-select>
  19. </nz-collapse-panel>
  20. </nz-collapse>
  21. <!-- <a>{{secondData.categoryName}}</a><b>({{secondData.categoryCode}})</b> -->
  22. </div>
  23. <ng-template #extraTemplate>
  24. <a>二级分类数量:{{data.subCategories.length}}</a>
  25. </ng-template>
  26. </nz-card>
  1. import { Component, OnInit } from '@angular/core';
  2. import { CategoryService } from '../category.service';
  3.  
  4. @Component({
  5. selector: 'app-category',
  6. templateUrl: '../pages/category.component.html',
  7. styleUrls: ['../pages/category.component.css']
  8. })
  9. export class CategoryComponent implements OnInit {
  10. //todo 搜索无法由下至上匹配1,2级数据
  11. public searchText:string;
  12.  
  13. topCategoriesData=[];
  14. thirdCategoriesData=[];
  15.  
  16. isLoading = false;
  17.  
  18. constructor(private categoryService:CategoryService) { }
  19. loadMore(id): void {
  20. this.isLoading = true;
  21. this.categoryService.getThirdById(id).subscribe((data:any) => {
  22. this.isLoading = false;
  23. this.thirdCategoriesData=data;
  24. });
  25. }
  26.  
  27. ngOnInit():void {
  28. this.categoryService.getCategoriesTop().subscribe(
  29. (data:any)=>{
  30. this.topCategoriesData = data;
  31. });
  32. }
  33.  
  34. }

关键代码是:globalFilter: {categoryName: searchText,categoryCode: searchText}

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

结语

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号