我有一个嵌套的HTML表,可在单击时展开。当我单击内部行时,我想获取列值。现在,我在点击外部行时获得列值。 例如,在下图中,当我单击编码/测试时,我希望将警报传递为“位置”。现在,当我单击城市时,我会收到“位置”警报。
组件:
trigger(){
var table: any = document.getElementById("table");
var rows = table.rows;
for (var i = 0; i < rows.length; i++) {
rows[i].onclick = (function (e) {
var j = 0;
var td = e.target;
while( (td = td.previousElementSibling) != null )
j++;
alert(rows[0].cells[j].innerHTML);
});
}
}
答案 0 :(得分:0)
您不需要任何DOM操作,可以简化以下解决方案:
app.component.ts
// .......
export class AppComponent {
trigger(columnName: string) {
alert(columnName);
}
// .......
}
app.component.html
<table class="table table-hover table-bordered table-responsive-xl" id="table">
<tr>
<td> Name </td>
<td> Place </td>
<td> Phone </td>
</tr>
<tbody>
<ng-container *ngFor="let data of data1">
<tr (click)="data.expanded = !data.expanded">
<td (click)="trigger('Name outer')"> {{ data.expanded ? '–' : '+'}} {{data.name}} </td>
<td (click)="trigger('Place outer')"> {{data.place}} </td>
<td (click)="trigger('Phone outer')"> {{data.phone}} </td>
<td (click)="trigger('Hobbies Outer')"> {{data.hobbies}} </td>
<td (click)="trigger('Profession outer')"> {{data.profession}} </td>
</tr>
<ng-container *ngIf="data.expanded">
<tr *ngFor="let data of findDetails(data)">
<td style="padding-left: 12px" (click)="trigger('Name inner')"> {{data.datades.name}} </td>
<td (click)="trigger('Hobbies inner')"> {{data.datades.hobbies}} </td>
<td (click)="trigger('Profession inner')"> {{data.datades.profession}} </td>
</tr>
</ng-container>
</ng-container>
</tbody>
</table>
答案 1 :(得分:0)
我不确定为什么在trigger
函数中有此代码。但是,如果在单击数据单元格时需要获取列名,则可以使用以下方法。
trigger
函数中,调用当前的event对象和标题行元素template variable:<table class="table table-hover table-bordered table-responsive-xl" id="table">
<tr #header>
</tr>
<tbody>
<ng-container *ngFor="let data of data1">
<ng-container *ngIf="data.expanded">
<tr *ngFor="let data of findDetails(data)" (click)="trigger($event, header)">
</tr>
</ng-container>
</ng-container>
</tbody>
</table>
因此,将#header
名称分配给第一个tr
元素,然后将其与$event
一起传递给trigger
函数。
trigger
函数中,使用这两个参数。 $event
将是常规MouseEvent对象,而header
将是常规tr元素。之后,您可以通过行中的单击单元格索引找到单击列标题。 StackOverflow thread中的gsnedders提供了有关如何在其父级中查找元素索引的解决方案。您的trigger
函数可能类似于:trigger($event, header) {
const index = this.getChildNumber($event.target);
alert(header.childNodes[index].textContent.trim());
}
此StackBlitz project说明了这种方法。