代码之家  ›  专栏  ›  技术社区  ›  davecar21

为角度物料表创建可重用组件并更改其表头

  •  0
  • davecar21  · 技术社区  · 6 年前

    我目前正在为角度材料表创建一个可重用的组件。 我已经为这个表创建了一个可重用的组件。

    我想把标题改成 *matHeaderCellDef 定义如下:

    columnHeader = ['studendID', 'fname', 'weight', 'symbol'];
    

    例如:更改 studentID 学生证和 fname 在表头中输入名字。

    enter image description here

    现在的问题是我无法更改表标题。


    请看我到目前为止所做的代码。

    数据表.component.html

    <mat-form-field>
      <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
    </mat-form-field>
    <table mat-table [dataSource]="dataSource" matSort class="mat-elevation-z8">
    
      <ng-container [matColumnDef]="tableData" *ngFor="let tableData of columnHeader">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> {{tableData}}    </th>
        <td mat-cell *matCellDef="let element"> {{element[tableData] }}</td>
      </ng-container>
    
      <tr mat-header-row *matHeaderRowDef="columnHeader"></tr>
      <tr mat-row *matRowDef="let row; columns: columnHeader;"></tr>
    </table>

    数据表.component.ts

    import {Component, OnInit, ViewChild, Input} from '@angular/core';
    import {MatSort, MatTableDataSource, MatTable} from '@angular/material';
    
    @Component({
      selector: 'app-data-table',
      templateUrl: './data-table.component.html',
      styleUrls: ['./data-table.component.css']
    })
    export class DataTableComponent implements OnInit {
      @Input() tableData;
      @Input() columnHeader;
      
      dataSource;
    
      @ViewChild(MatSort) sort: MatSort;
    
      ngOnInit() {
        console.log(this.tableData);
        this.dataSource = new MatTableDataSource(this.tableData);
        this.dataSource.sort = this.sort;
        
      }
    
      applyFilter(filterValue: string) {
        this.dataSource.filter = filterValue.trim().toLowerCase();
      }
    }

    employee.component.html公司

    <app-data-table [tableData]="tableData" [columnHeader]="columnHeader"></app-data-table>

    职员.component.ts

    import { Component, OnInit } from '@angular/core';
    import { DataTableComponent } from '../shared/data-table/data-table.component';
    
    export interface PeriodicElement {
      fname: string;
      studendID: number;
      weight: number;
      symbol: string;
    }
    
    
    
    @Component({
      selector: 'app-employee',
      templateUrl: './employee.component.html',
      styleUrls: ['./employee.component.css']
    })
    export class EmployeeComponent implements OnInit {
    
      constructor() { }
    
      ngOnInit() {
      }
    
      columnHeader = ['studendID', 'fname', 'weight', 'symbol'];
    
      tableData: PeriodicElement[] = [
        {studendID: 1, fname: 'Hydrogen', weight: 1.0079, symbol: 'H'},
        {studendID: 2, fname: 'Helium', weight: 4.0026, symbol: 'He'},
        {studendID: 3, fname: 'Lithium', weight: 6.941, symbol: 'Li'},
        {studendID: 4, fname: 'Beryllium', weight: 9.0122, symbol: 'Be'},
        {studendID: 5, fname: 'Boron', weight: 10.811, symbol: 'B'},
        {studendID: 6, fname: 'Carbon', weight: 12.0107, symbol: 'C'},
        {studendID: 7, fname: 'Nitrogen', weight: 14.0067, symbol: 'N'},
        {studendID: 8, fname: 'Oxygen', weight: 15.9994, symbol: 'O'},
        {studendID: 9, fname: 'Fluorine', weight: 18.9984, symbol: 'F'},
        {studendID: 10, fname: 'Neon', weight: 20.1797, symbol: 'Ne'},
      ];
    
    }

    请看 Stackblitz Link 为了现场代码。

    1 回复  |  直到 5 年前
        1
  •  1
  •   msnfreaky    5 年前

    我希望这对你有帮助!(必须更改HTML才能获取标题)

    职员.component.ts

    将ColumnHeader保留为对象而不是数组。或者可以将其扩展到一个对象数组中,以提及额外的信息,如管道、呈现为HTML等,

    columnHeader = {'studentID': 'ID', 'fname': 'First Name', 'lname': 'Last Name', 'weight': 'Weight', 'symbol': 'Code'};
    

    数据表.component.html

    <ng-container [matColumnDef]="tableData" *ngFor="let tableData of objectKeys(columnHeader)">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> {{columnHeader[tableData]}}    </th>
        <td mat-cell *matCellDef="let element"> {{element[tableData] }}</td>
      </ng-container>
    
      <tr mat-header-row *matHeaderRowDef="objectKeys(columnHeader)"></tr>
      <tr mat-row *matRowDef="let row; columns: objectKeys(columnHeader);"></tr>
    

    数据表.component.ts

    @Input() columnHeader;
    objectKeys = Object.keys;
    

    StackBlitz

        2
  •  0
  •   Shreenil Patel    6 年前

    我建议用最简单的方法。 您可以定义函数以获取标题名称,如下所示

    HTML:

    <ng-container [matColumnDef]="tableData" *ngFor="let tableData of columnHeader">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> {{getHeader(tableData)}}    </th>
        <td mat-cell *matCellDef="let element"> {{element[tableData] }}</td>
      </ng-container>
    

    TS:

    getHeader(tableData) {
        if(tableData === "studendID")
          return "Student ID";
        if(tableData === "fname")
          return "First Name";
        return tableData;
      }
    
        3
  •  0
  •   Wildhammer    5 年前

    对史莱尼的回答稍加改进:

    <ng-container [matColumnDef]="tableData" *ngFor="let tableData of columnHeader">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> 
        {tableData, select, 
            studentid {Student ID}
            fname {First Name}
        }
        </th>
        <td mat-cell *matCellDef="let element"> {{element[tableData] }}</td>
    </ng-container>
    

    模板中的绑定越少,实现的渲染性能就越高。