表格搜索过滤器无法工作,Angular 10

12 浏览
0 Comments

表格搜索过滤器无法工作,Angular 10

我正在开发一个用户模块,其中包含一个用于管理目的的用户视图。

我可以看到我的数据,所以这部分没问题,但我不明白搜索过滤器应该如何工作。以下是我的代码。我对TypeScript和Angular都是新手,所以我正在使用网上的示例,但是失败了。呵呵!无论如何,我在搜索过滤器中输入内容,但没有任何反应。

users.component.ts

import { Component, OnInit, ViewChild, Input } from '@angular/core';
import { FormControl } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { Subject } from 'rxjs';
import { Router } from "@angular/router";
import { UserService } from '../../users/user.service';
import { MatInput } from "@angular/material/input";
import { MatSort } from '@angular/material/sort';
import { BehaviorSubject } from "rxjs";
import { Observable } from 'rxjs';
import { MatTableDataSource } from '@angular/material/table';
@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.scss']
})
export class UsersComponent implements OnInit {
  public users: any[] = [];  
  searchControl = new FormControl();
  filteredOptions: Observable;  
  MatTableDataSource: Observable;
  resetUsers: any;
  @Input() header = "用户视图";  
  @Input() columns = [
    { userName : "用户名" },
    { firstName: "名字" },
    { lastName: "姓氏" },
    { phone: "电话" }, 
    { email: "邮箱" },    
  ];
  @Input() data: any[]; 
  @ViewChild(MatInput, { static: false }) search: MatInput;
  @ViewChild(MatSort) sort: MatSort;
  @ViewChild(MatPaginator) paginator: MatPaginator;
  displayData = [];
  constructor(   
    private userService: UserService,    
    private httpClient: HttpClient
  ) { }
  dataSource = new MatTableDataSource();
  ngOnInit(): void {    
    this._getUsers();    
  }
  ngAfterViewInit() {
    this.userService.getUsers().subscribe(data => {
      this.users = data.users;  
    });   
    this.search.stateChanges.subscribe(() => {
      this.displayData = [];
      this.users.forEach((entry) => {        
        if (entry.header.toLowerCase().includes(this.search.value.toLowerCase())) {
          this.displayData.push(entry);       
        }
      });
    });
  }
  private _getUsers() {    
    this.userService;
    this.userService.getUsers().subscribe(data => {
      this.users = data.users;  
    }); 
  }
}

user.component.html

搜索 {{option}}

0
0 Comments

问题原因:displayData变量没有被正确使用,导致表格搜索过滤不起作用。

解决方法1:将displayData作为表格的数据输入,代码如下:



同时,在获取用户数据时也要更新displayData变量,代码如下:

this.userService.getUsers().subscribe(data => {
  this.users = data.users;
  this.displayData = data.users;
});

解决方法2:创建一个过滤器管道来对表格数据进行过滤,代码如下:

过滤器:

import { Pipe, PipeTransform } from "@angular/core";
@Pipe({
  name: "filterTable"
})
export class FilterTablePipe implements PipeTransform {
  constructor() {}
  transform(rows: any[], search: string): any {
    // 在这里创建过滤逻辑
    // 假设行对象有一个name属性,表示用户名
    return rows.filter(row => row.name.includes(search));
  }
}

在HTML中使用:



其中,searchValue是用户输入的搜索值,需要在代码中创建这个变量。

这里提供了一个根据输入值来过滤日期列表的示例,虽然不完全相同,但可以帮助你理解:[https://stackblitz.com/edit/angular-ivy-filter-date-list?file=src%2Fapp%2Fapp.component.html](https://stackblitz.com/edit/angular-ivy-filter-date-list?file=src%2Fapp%2Fapp.component.html)。

重要提示:在更新列表后,可能需要调用renderRows()方法来重新渲染表格,参考链接:[Calling renderRows() on Angular Material Table](https://stackoverflow.com/questions/49284358)。

0
0 Comments

问题描述: 表格搜索过滤器无法工作。
问题原因: 原因未提及。
解决方法: 未提供解决方法。
0