我遇到了一些问题。我在Angular 6中有一个组件,其中正在使用数据生成多个Mat-Table。我在div标签中使用ng-for循环遍历所有Mat-Table数据源。后来我试图在表中添加新行。到这里为止还可以,但是无法获取单击了“添加行”功能的表的实例。在.ts fenter代码中,借助View-Child的方法始终仅获取第一个表的实例。我想获取所有表的实例,通过该实例,我将调用render rows函数来刷新视图中选择的MatTable
为View和TS文件粘贴了示例代码。注意“添加”现在不起作用。
<div *ngFor="let data of ViewContent">
<button (click)="addElement(event,data?.tableValues,displayedColumns)">Add element</button> <br />
<table #testTable mat-table [dataSource]="data?.tableValues">
<!-- Col1 Column -->
<ng-container matColumnDef="Col1">
<th mat-header-cell *matHeaderCellDef> Col1 </th>
<td mat-cell *matCellDef="let element"> {{element.Col1}} </td>
</ng-container>
<!-- Col2 Column -->
<ng-container matColumnDef="Col2">
<th mat-header-cell *matHeaderCellDef> Col2 </th>
<td mat-cell *matCellDef="let element"> {{element.Col2}} </td>
</ng-container>
<!-- Col3 Column -->
<ng-container matColumnDef="Col3">
<th mat-header-cell *matHeaderCellDef> Col3 </th>
<td mat-cell *matCellDef="let element"> {{element.Col3}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<!-- Copyright 2019 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license -->
</div>
import {DataSource} from '@angular/cdk/collections';
import {Component,OnInit,ViewChild} from '@angular/core';
import {BehaviorSubject, Observable} from 'rxjs';
import DalContentdata from 'Content.json';
import { MatTable } from '@angular/material';
@Component({
selector: 'cdk-table-basic-example',
styleUrls: ['cdk-table-basic-example.css'],
templateUrl: 'cdk-table-basic-example.html',
})
export class CdkTableBasicExample implements OnInit {
ViewContent: Object;
displayedColumns: string[] = ['Col1','Col2','Col3'];
@ViewChild('testTable') table: MatTable<any>;
ngOnInit() {
this.ViewContent = [
{
"title":"abc",
"tableValues": [
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
}
]
},
{
"title":"abc",
"displayColumns": "Col1,Col2,Col3",
"tableValues": [
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
}
]
},
{
"title":"abc",
"displayColumns": "Col1,Col2,Col3",
"tableValues": [
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
},
{
"Col1": "Apple",
"Col2": "Mango",
"Col3": "Orange"
}
]
}
];
}
addElement(event, title, tableDataSource, displayColumns) {
console.log('beforeAdd', tableDataSource);
tableDataSource.push({
Col1: 'Test',Col2:'Test',Col3:'Test'
})
console.log('afteradd', tableDataSource);
this.table.renderRows();
console.log('afteradd', tableDataSource);
}
}
/** Copyright 2019 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license */
答案 0 :(得分:1)
您应该使用ViewChild。
html: 假设您的表在for循环内运行,并且索引变量名为i:
<table id="testTable{{i}}" [dataSource]="yourDataSource"><!--data source can be set from ts as well-->
ts:
@ViewChild('testTable1') matTable1: MatTable<any>;
@ViewChild('testTable2') matTable2: MatTable<any>;
@ViewChild('testTable3') matTable3: MatTable<any>;
或者当然也可以只使用数组。
别忘了导入它,您将更喜欢使用AfterViewInit生命周期挂钩
ngAfterViewInit() {
// this.matTable...
}
编辑:
如果您希望刷新数据源
this.matTable.dataSource = [... this.data]
您只需传递新数组(带有新引用),它将触发数据更改,并且您的数据表将刷新
如果您希望使用for为每个表创建一个unic ID,
答案 1 :(得分:1)
我遇到了类似的问题,并使用ViewChildren而不是ViewChild解决了该问题。
我最初有:
@ViewChild(MatTable) table: MatTable<string>;
然后要调用renderRows,我在打电话
this.table.renderRows();
但是,然后我需要在同一组件中创建另一个表,因此我的代码更改为:
@ViewChildren(MatTable) table !: QueryList<MatTable<string>>;
和
this.table.first.renderRows();
this.table.last.renderRows();
第一个和最后一个是queryList的属性。 https://angular.io/api/core/QueryList#properties
确保要导入MatTable
import { MatTable } from "@angular/material/table";
答案 2 :(得分:0)
在html中:
<table
mat-table
id="table"
class="full-width"
[dataSource]="dataSource"
matSort
data-cy="pg_table"
(matSortChange)="onSortData($event)"
#table1
>
在模板中:
@ViewChild('table1', { static: true }) table1: MatTable<any>;
答案 3 :(得分:0)
扩展Chishty的答案,如果表为'n',则可以在循环中使用@ViewChildren
并在每个表上调用renderRows()
。总体步骤如下-
导入mat-table
从'@ angular / material / table'导入{MatTable};
用@ViewChildren
声明QueryList
@ViewChildren(MatTable)csvTable!:QueryList
在添加或删除操作上调用renderRows
this.csvTable.toArray()。forEach(data => data.renderRows());
请记住在模板中使用与table-id相同的变量
有关@ViewChildren
-Angular Docs的更多信息
有关QueryList
-Angular Docs