我在同一个组件中有2个材质2个表并进行排序。我找不到将MatSort指令分配给自己的表的方法。我只能在第一个表上使用MatSort,而第二个表不能识别它上面有MatSort。有谁知道如何配置两个表在同一组件中排序?
我尝试使用不同的名称定义ViewChild,但它不起作用。
@ViewChild('hBSort') hBSort: MatSort;
@ViewChild('sBSort') sBSort: MatSort;
this.hBSource = new HBDataSource(this.hBDatabase, this.hBPaginator,
this.hBSort);
this.sBSource = new SBDataSource(this.sBDatabase, this.sBPaginator,
this.sBSort);
Table 1
const displayDataChanges = [
this.hBPaginator.page,
this.hBSort.sortChange,
this._filterChange
];
Table 2
const displayDataChanges = [
this.sBPaginator.page,
this.sBSort.sortChange,
this._filterChange
];
Table 1
<mat-table #hBtable [dataSource]="hBSource" matSort style="min-width:
740px;">
<ng-container matColumnDef="domain">
<mat-header-cell *matHeaderCellDef mat-sort-header> {{'list.domain' | translate}} </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.domain}} </mat-cell>
</ng-container>
<ng-container matColumnDef="general">
<mat-header-cell *matHeaderCellDef mat-sort-header> {{'list.general' | translate}} </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.general.gNum}} ({{row.general.gPct | number: '1.1-2'}}%) </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="hBColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: hBColumns;"></mat-row>
</mat-table>
Table 2
<mat-table #sBSort [dataSource]="sBSource" matSort style="min-width: 1200px;">
<ng-container matColumnDef="domain">
<mat-header-cell *matHeaderCellDef mat-sort-header> {{'list.domain' | translate}} </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.domain}} </mat-cell>
</ng-container>
<ng-container matColumnDef="general">
<mat-header-cell *matHeaderCellDef mat-sort-header> {{'list.general' | translate}} </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.general.gNum}} ({{row.general.gPct | number: '1.1-2'}}%) </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="sBColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: sBColumns;"></mat-row>
</mat-table>
答案 0 :(得分:20)
对此的修复是,在DOM中定义ViewChild引用后,需要确保在其后添加=“matSort”。
步骤:
在组件中设置MatSort实例,并在DataSource依赖项中定义它们,如下所示:
@ViewChild('hBSort') hBSort: MatSort;
@ViewChild('sBSort') sBSort: MatSort;
this.hBSource = new HBDataSource(this.hBDatabase, this.hBPaginator,
this.hBSort);
this.sBSource = new SBDataSource(this.sBDatabase, this.sBPaginator,
this.sBSort);
在DOM中定义ViewChild引用并将它们设置为等于matSort(注意:matSort属性位于mat-table标记上):
Table 1
<mat-table #hBSort="matSort" [dataSource]="hBSource" matSort
style="min-width: 740px;">
***Table Rows and pagination***
</mat-table>
Table 2
<mat-table #sBSort="matSort" [dataSource]="sBSource" matSort
style="min-width: 1200px;">
***Table Rows and pagination***
</mat-table>
答案 1 :(得分:5)
修改强>
我相信你需要:
@ViewChild(MatSort) sort: MatSort;
在你的上方:
@ViewChild('hBSort') hBSort: MatSort;
@ViewChild('sBSort') sBSort: MatSort;
然后:
ngAfterViewInit() {
this.hBSource.sort = this.sort;
this.sBSource.sort = this.sort;
}
假设您的HBDataSource和SBDataSource都导出MatTableDataSource();
我引用了这些来源:
https://material.angular.io/components/sort/overview https://github.com/angular/material2/blob/master/src/demo-app/table/table-demo.ts
答案 2 :(得分:4)
这是Angular 6的工作解决方案:
import { MatSort, MatTableDataSource } from '@angular/material';
...
@ViewChild('sortCol1') sortCol1: MatSort;
@ViewChild('sortCol2') sortCol2: MatSort;
...
数据源1:
this.dataSource1 = new MatTableDataSource(this.dataSource1);
this.dataSource1.sort = this.sortCol1;
数据源2:
this.dataSource2 = new MatTableDataSource(this.dataSource2);
this.dataSource2.sort = this.sortCol2;
...
表1(视图):
<table mat-table #sortCol1="matSort" [dataSource]="dataSource1" matSort matSortActive="ID" matSortDirection="asc">
...
</table>
表2(视图):
<table mat-table #sortCol2="matSort" [dataSource]="dataSource2" matSort matSortActive="ID" matSortDirection="asc">
...
</table>
答案 3 :(得分:1)
我建议为表创建一个通用组件,可以在应用程序的多个位置使用。由于组件将创建它的单独实例,因此mat表与功能没有冲突。
在这种情况下,您不需要重复2个表的代码。下面是您可以实现的Table通用组件。
Home.component.ts
export class HomeComponent implements OnInit {
public data1: any[];
public data2: any[];
constructor() {
}
ngOnInit() {
this.data1 = [
{domain: 'Hello1', gNum: 1, gPct: 'table-data1'},
{domain: 'Hello2', gNum: 2, gPct: 'table-data2'},
{domain: 'Hello3', gNum: 3, gPct: 'table-data3'},
{domain: 'Hello4', gNum: 4, gPct: 'table-data4'},
{domain: 'Hello5', gNum: 5, gPct: 'table-data5'},
{domain: 'Hello6', gNum: 6, gPct: 'table-data6'},
{domain: 'Hello7', gNum: 7, gPct: 'table-data7'},
];
this.data2 = [
{domain: 'Hello1', gNum: 1, gPct: 'table-data1'},
{domain: 'Hello2', gNum: 2, gPct: 'table-data2'},
{domain: 'Hello3', gNum: 3, gPct: 'table-data3'},
{domain: 'Hello4', gNum: 4, gPct: 'table-data4'},
{domain: 'Hello5', gNum: 5, gPct: 'table-data5'},
{domain: 'Hello6', gNum: 6, gPct: 'table-data6'},
{domain: 'Hello7', gNum: 7, gPct: 'table-data7'},
]
}
}
Home.component.html
<app-table-component [data]='data1'></app-table-component>
<app-table-component [data]='data2'></app-table-component>
Table.component.ts
@Component({
selector: 'app-table-component',
templateUrl: 'table.component.html',
styleUrls: ['table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TableComponent implements OnInit, OnChanges {
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
@Input() data: any[];
public displayedColumns = ['domain', 'gNum', 'gPct'];
public dataSource: MatTableDataSource<any>;
constructor() {
}
public ngOnInit() {
setTimeout(() => {
this.dataSource = new MatTableDataSource(this.data);
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
});
}
public ngOnChanges(changes: SimpleChanges) {
this.dataSource = new MatTableDataSource(changes.data.currentValue);
}
}
Table.component.html
<mat-table #table [dataSource]="dataSource" matSort matSortDisableClear matSortDirection="asc">
<ng-container matColumnDef="domain">
<mat-header-cell *matHeaderCellDef mat-sort-header>Domain </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.domain}} </mat-cell>
</ng-container>
<ng-container matColumnDef="gNum">
<mat-header-cell *matHeaderCellDef mat-sort-header>G Number </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.gNum}} </mat-cell>
</ng-container>
<ng-container matColumnDef="gPct">
<mat-header-cell *matHeaderCellDef mat-sort-header>Global Pct </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.gPct}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;">
</mat-row>
</mat-table>
<mat-paginator [pageSizeOptions]="[5, 10, 25, 100]"></mat-paginator>
答案 4 :(得分:1)
在Angular 7中,您需要QuerySet
both
和引用matSort
:
#sorter1="matSort"
然后
<table mat-table [dataSource]="ds1" matSort #sorter1="matSort">
</table>
<table mat-table [dataSource]="ds2" matSort #sorter2="matSort">
</table>