前言
我們在開發過程中經常會遇到在頁面上實現全局搜索的需求,例如:表格搜索,通過關鍵詞檢索整個表格,過濾出我們需要的數據。在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>
新聞熱點
疑難解答
圖片精選