什么时候调用计算元素宽度的函数?
When to call function that calculates width of elements?
在我的 angular 项目中,我有两个 table。
table 之一从服务加载数据,并在 ngOnInit 上返回此数据。
我正在计算 header 列宽度并将其应用于另一个 table。
我在 :
上调用 this.resizeColumn() 函数
ngAfterViewInit() {
this.resizeColumns();
}
还有:
@HostListener('window:resize')
onResize() {
this.resizeColumns();
}
问题是,第一次打开页面时,尚未应用计算出的宽度。
一旦我调整 window 的大小,那么两个 header 就会匹配。
这个想法是每当 table 宽度改变时,这个函数也会被调用。
在发生什么事件或生命周期挂钩后,我应该调用 resizeColumn,以便最初两个 table 具有相同的列宽?
您可以利用 属性 绑定到 link 两个 table 的列宽,如 this plunker 所示。在我的示例中,顶部 table 中的列宽定期增加,底部 table 列宽跟随 属性 绑定。
<table>
<tr #table1Row>
<td>Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<tr>
</table>
<table>
<tr>
<td [style.width.px]="getColWidth(table1Row, 0)">Column 1</td>
<td [style.width.px]="getColWidth(table1Row, 1)">Column 2</td>
<td [style.width.px]="getColWidth(table1Row, 2)">Column 3</td>
<tr>
</table>
// Get the column width from Table 1
public getColWidth(row: HTMLTableRowElement, index: number): number {
return row.cells[index].offsetWidth;
}
更新:
如果您需要异步更改(避免Angular异常),您可以尝试以下代码(在this plunker中实现) .它调用 setTimeout
以在当前执行周期后获得新的宽度。
private colWidths: Array<number> = [ 0, 0, 0 ];
public getColWidth(row: HTMLTableRowElement, index: number): number {
let width = row.cells[index].offsetWidth;
if (Math.abs(this.colWidths[index] - width) > 0.001) {
setTimeout(() => {
this.colWidths[index] = width;
}, 0);
}
return this.colWidths[index];
}
在我的 angular 项目中,我有两个 table。 table 之一从服务加载数据,并在 ngOnInit 上返回此数据。
我正在计算 header 列宽度并将其应用于另一个 table。 我在 :
上调用 this.resizeColumn() 函数 ngAfterViewInit() {
this.resizeColumns();
}
还有:
@HostListener('window:resize')
onResize() {
this.resizeColumns();
}
问题是,第一次打开页面时,尚未应用计算出的宽度。 一旦我调整 window 的大小,那么两个 header 就会匹配。 这个想法是每当 table 宽度改变时,这个函数也会被调用。 在发生什么事件或生命周期挂钩后,我应该调用 resizeColumn,以便最初两个 table 具有相同的列宽?
您可以利用 属性 绑定到 link 两个 table 的列宽,如 this plunker 所示。在我的示例中,顶部 table 中的列宽定期增加,底部 table 列宽跟随 属性 绑定。
<table>
<tr #table1Row>
<td>Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<tr>
</table>
<table>
<tr>
<td [style.width.px]="getColWidth(table1Row, 0)">Column 1</td>
<td [style.width.px]="getColWidth(table1Row, 1)">Column 2</td>
<td [style.width.px]="getColWidth(table1Row, 2)">Column 3</td>
<tr>
</table>
// Get the column width from Table 1
public getColWidth(row: HTMLTableRowElement, index: number): number {
return row.cells[index].offsetWidth;
}
更新:
如果您需要异步更改(避免Angular异常),您可以尝试以下代码(在this plunker中实现) .它调用 setTimeout
以在当前执行周期后获得新的宽度。
private colWidths: Array<number> = [ 0, 0, 0 ];
public getColWidth(row: HTMLTableRowElement, index: number): number {
let width = row.cells[index].offsetWidth;
if (Math.abs(this.colWidths[index] - width) > 0.001) {
setTimeout(() => {
this.colWidths[index] = width;
}, 0);
}
return this.colWidths[index];
}