You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular中基于*ngFor表格实现指定列搜索过滤的方法

Solution: Filter Only Selected Columns in Angular Table

Got it, let's adjust your code so you can restrict the search to specific columns instead of scanning the entire table. Here's a step-by-step approach that works with your existing setup:

1. Add a Variable for Selected Columns

First, in your component class, add a variable to track which columns you want to search. You can set default columns or let users select them later:

term: string;
variables: Variables[] = [];
// Replace with your actual column names (from your `index` array)
selectedColumns: string[] = ['columnName1', 'columnName2']; 

2. Update or Create a Custom Filter Pipe

Your current filter pipe checks all properties of each Variables object. Let's modify it to only look at the selected columns. If you don't have a custom pipe yet, create one:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'filter' })
export class FilterPipe implements PipeTransform {
  transform(items: Variables[], term: string, selectedColumns: string[]): Variables[] {
    // Return all items if no search term or no columns selected
    if (!items || !term || !selectedColumns || selectedColumns.length === 0) {
      return items;
    }

    const lowerCaseTerm = term.toLowerCase();
    return items.filter(item => {
      // Check if any selected column contains the search term
      return selectedColumns.some(column => {
        const value = item[column];
        // Handle null/undefined values safely
        return value && value.toString().toLowerCase().includes(lowerCaseTerm);
      });
    });
  }
}

Don't forget to declare this pipe in your Angular module!

3. Modify the Template to Use Selected Columns

Update your *ngFor to pass the selectedColumns as an argument to the filter pipe:

<tr *ngFor="let new of variables | orderBy: key: reverse | filter:term:selectedColumns" style="width: 100%;">
  <td *ngFor="let col of index" id="tablo_data"> {{new[col]}} </td>
</tr>

4. (Optional) Add UI for Users to Select Columns

If you want users to choose which columns to search, add checkboxes tied to the selectedColumns variable:

<!-- Column selection checkboxes -->
<div class="form-group">
  <label>Columns to search:</label>
  <div class="ml-2" *ngFor="let col of index">
    <input type="checkbox" [(ngModel)]="selectedColumns" [value]="col">
    <span class="ml-1">{{col}}</span>
  </div>
</div>

<!-- Search input -->
<div class="form-group">
  <input type="text" class="form-control" placeholder="Search Here" [(ngModel)]="term">
</div>

Performance Note (Important!)

Angular's change detection runs pipes on every cycle, which can slow down your app if you have a large dataset. For better performance, move the filtering logic into your component instead of using a pipe:

filteredVariables: Variables[] = [];

ngOnInit(): void {
  this.filteredVariables = [...this.variables];
}

// Call this whenever term or selectedColumns changes
applyFilter(): void {
  if (!this.term || !this.selectedColumns || this.selectedColumns.length === 0) {
    this.filteredVariables = [...this.variables];
    return;
  }

  const lowerCaseTerm = this.term.toLowerCase();
  this.filteredVariables = this.variables.filter(item => {
    return this.selectedColumns.some(column => {
      const value = item[column];
      return value && value.toString().toLowerCase().includes(lowerCaseTerm);
    });
  });
}

Then update your template to use filteredVariables:

<tr *ngFor="let new of filteredVariables | orderBy: key: reverse" style="width: 100%;">
  <td *ngFor="let col of index" id="tablo_data"> {{new[col]}} </td>
</tr>

<!-- Update input to trigger filter on change -->
<input type="text" class="form-control" placeholder="Search Here" [(ngModel)]="term" (ngModelChange)="applyFilter()">

内容的提问来源于stack exchange,提问作者adobean

火山引擎 最新活动