我想创建可重复使用的角度材料数据表,该表可被任何组件使用,并且只需要传递所需的列标题和其他表数据。下面是我尝试过的:
我正在关注以下示例:stackblitz
在shared
文件夹中创建了src/app
文件夹。以及数据表组件也可以重用。
data-table.component.html:
<table mat-table [dataSource]="dataSource" matSort class="mat-elevation-z8">
<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; let i=index;"> {{element[tableData]}}</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="objectKeys(columnHeader)"></tr>
<tr mat-row *matRowDef="let row; columns: objectKeys(columnHeader);"></tr>
</table>
data-table.component.ts:
import { Component, OnInit, Input, ViewChild } from '@angular/core';
import { MatSort, MatTableDataSource, MatPaginator } from '@angular/material';
@Component({
selector: 'app-data-table',
templateUrl: './data-table.component.html',
styleUrls: ['./data-table.component.scss']
})
export class DataTableComponent implements OnInit {
@Input() tableData;
@Input() columnHeader;
@Input() source;
objectKeys = Object.keys;
dataSource;
@ViewChild(MatSort, { static: false }) sort: MatSort;
@ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
constructor() { }
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();
}
}
现在我在需要的地方使用app-data-table
选择器。我要在其中使用个人资料组件。
profile-setup.component.html:
<app-data-table [tableData]="tableData" [columnHeader]="columnHeader"></app-data-table>
profile-setup.component.ts:
import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { ProfileSetUp } from 'src/app/_interface/profile-setup.module';
@Component({
selector: 'app-profile-setup',
templateUrl: './profile-setup.component.html',
styleUrls: ['./profile-setup.component.scss']
})
export class ProfileSetupComponent implements OnInit {
constructor() { }
ngOnInit() {
}
columnHeader = {'profileName': 'Profile Name', 'profileDesc': 'Description', 'adminUser': 'Admin User', 'id': ''};
tableData: ProfileSetUp[] = [
{
id: 1,
profileName: "Cameron Villams",
profileDesc: "Face to face contact",
adminUser: "Iwan Rynders",
action: ""
},
{
id: 2,
profileName: "Charl Angle",
profileDesc: "Face to face contact",
adminUser: "Unknown",
action: ""
},
{
id: 3,
profileName: "Johan Abraham",
profileDesc: "Face to face contact",
adminUser: "Unknown",
action: ""
},
{
id: 4,
profileName: "Niekie Gadgilly",
profileDesc: "Face to face contact",
adminUser: "Unknown",
action: ""
},
{
id: 5,
profileName: "Veer S",
profileDesc: "Face to face contact",
adminUser: "Unknown",
action: ""
}
];
}
profile-setup.module:
export interface ProfileSetUp {
id: number;
profileName: string;
profileDesc: string;
adminUser: string;
action: string;
}
我如何有条件地显示数据,例如,某些数据表可能具有“编辑”,“删除”按钮,而有些没有这些按钮。任何帮助将不胜感激。
答案 0 :(得分:0)
可以将回调函数传递给表组件。 (更新的项目:stackblitz)
DataTableComponent
为按钮添加一个输入并对其进行调用。
@Input() editButton;
onEdit(element) {
this.editButton(element);
}
data-table.component.html
添加逻辑以添加用于编辑回调连接的按钮。
<div *ngIf="columnHeader[tableData] != 'Edit'">
<td mat-cell *matCellDef="let element"> {{element[tableData] }}</td>
</div>
<div *ngIf="columnHeader[tableData] == 'Edit'">
<td mat-cell *matCellDef="let element">
<button mat-button (click)="onEdit(element)">
edit
</button>
</td>
</div>
EmployeeComponent
添加一个编辑列。
columnHeader = {'studentID': 'ID', 'fname': 'First Name', 'lname': 'Last Name', 'weight': 'Weight', 'symbol': 'Code', 'edit': 'Edit'};
为回调创建方法。
onEditClick = (element) => this.onEdit(element);
onEdit(element) {
console.log(element);
}
employee.component.html
<app-data-table [tableData]="tableData" [columnHeader]="columnHeader" [editButton]="onEditClick"></app-data-table>