Почему фильтр клиента не работает в таблице угловых приложений

Я реализовал таблицу материалов с функцией фильтрации клиентов, но она не работала.

код выглядит так:

<table mat-table [dataSource]="tableData" matSort>
    <ng-container matColumnDef="vin">
      <th mat-header-cell *matHeaderCellDef mat-sort-header>
        <mat-form-field>
          <input matInput [formControl]="vinFilter" placeholder="Vin Filter" />
        </mat-form-field>
      </th>
      <td mat-cell *matCellDef="let row">
        <button (click)="searchByVin(row.vin)">{{ row.vin }}</button>
      </td>
    </ng-container>

    <ng-container matColumnDef="licensePlate">
      <th mat-header-cell *matHeaderCellDef mat-sort-header>
        <mat-form-field>
          <input
            matInput
            [formControl]="licensePlateFilter"
            placeholder="License Plate Filter"
          />
        </mat-form-field>
      </th>
      <td mat-cell *matCellDef="let row">{{ row.licensePlate }}</td>
    </ng-container>

    <!-- Name Column -->
    <ng-container matColumnDef="status">
      <th mat-header-cell *matHeaderCellDef mat-sort-header>
        <mat-form-field>
          <mat-select multiple placeholder="Status">
            <mat-option
              *ngFor="let selectFilterOption of selectFilterOptions"
              [(value)]="selectFilterOption"
            >
              {{ selectFilterOption }}
            </mat-option>
          </mat-select>
        </mat-form-field>
      </th>
      <td mat-cell *matCellDef="let row">
        <ng-container *ngIf="row.status === OverViewEntryStatus.SUCCESS">
          <div class="state-success">
            <mat-icon>done</mat-icon>
          </div>
          {{ row.status }}
        </ng-container>
        <ng-container *ngIf="row.status === OverViewEntryStatus.FAILURE">
          <div class="state-failure">
            <mat-icon>clear</mat-icon>
          </div>
          {{ row.status }}
        </ng-container>
        <ng-container *ngIf="row.status === OverViewEntryStatus.UNKNOWN">
          <div class="state-unknown">
            <mat-icon>clear</mat-icon>
          </div>
          {{ row.status }}
        </ng-container>
      </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
  </table>

файл ts:

import { OverViewEntryStatus } from "app/shared/enums/overview-entry-status";
import { Component, OnInit } from "@angular/core";
import { FormControl } from "@angular/forms";
import { MatTableDataSource } from "@angular/material";
import { CompanyService } from "@app/services/company.service:";
import * as _ from "underscore";
import { Router } from "@angular/router";

export interface AllVehicleOverview {
  vin: string;
  licensePlate: string;
  status: string;
}
@Component({
  selector: "app-all-fins-overview",
  templateUrl: "./all-fins-overview.component.html",
  styleUrls: ["./all-fins-overview.component.scss"],
})
export class AllFinsOverviewComponent implements OnInit {
  OverViewEntryStatus: typeof OverViewEntryStatus = OverViewEntryStatus;
  public isLoadingAllFinsOverviewData: boolean;
  tableData: any;
  displayedColumns: string[];
  selectFilterOptions: string[];
  vinFilter = new FormControl();
  licensePlateFilter = new FormControl();
  filteredValues = { vin: "", lisencePlat: "" };
  constructor(private companyService: CompanyService, private router: Router) {}

  ngOnInit() {
    this.tableData = new MatTableDataSource();
    this.loadAllFinsOverviewData();
    this.doFilter();
    this.tableData.filterPredicate = this.createFilter();
  }

  loadAllFinsOverviewData() {
this.tableData = DATA;
this.displayedColumns = _.keys(_.first(this.tableData));
        this.selectFilterOptions = this.getSelectOptionValues(data, "status");
  }

  doFilter() {
    this.vinFilter.valueChanges.subscribe(positionFilterValue => {
      this.filteredValues["vin"] = positionFilterValue;
      this.tableData.filter = JSON.stringify(this.filteredValues);
      this.tableData.filterPredicate = this.createFilter();
    });

    this.licensePlateFilter.valueChanges.subscribe(positionFilterValue => {
      this.filteredValues["licensePlate"] = positionFilterValue;
      this.tableData.filter = JSON.stringify(this.filteredValues);
      this.tableData.filterPredicate = this.createFilter();
    });
  }

  getSelectOptionValues(data, column) {
    let result: string[] = [];
    data.forEach(value => {
      result.push(value[column]);
    });

    return this.filterData(result);
  }

  filterData(data) {
    return data.reduce((x, y) => (x.includes(y) ? x : [...x, y]), []);
  }

  customFilter() {
    console.log("hier hier hier");
    const filterFunction = function(data, filter): boolean {
      console.log("hierasdasdaf");
      let searchString = JSON.parse(filter);
      return (
        data.vin
          .toString()
          .trim()
          .indexOf(searchString.vin) !== -1
      );
    };
    return filterFunction;
  }

  createFilter(): (data: any, filter: string) => boolean {
    let filterFunction = function(data, filter): boolean {
      let searchTerms = JSON.parse(filter);
      return (
        data.vin.toLowerCase().indexOf(searchTerms.name) !== -1 &&
        data.lisencePlat
          .toString()
          .toLowerCase()
          .indexOf(searchTerms.id) !== -1
      );
    };
    return filterFunction;
  }

  searchByVin(value) {
    sessionStorage.setItem("asdfa", value);
    this.router.navigate(["dashboard/overview"]);
  }
}

export const DATA = [{
vin: "test",
licensePlate: "test",
}]

Я не знаю, что не правильно. Я реализовал это на примере в интернете. Но не могу найти, что я не правильно сделал. Я несколько раз пытался связать функцию customerFilter, но при отладке она не была включена в эту функцию.

у вас есть какие-то решения?

С уважением,

0 ответов

Другие вопросы по тегам