2017-12-10 8 views
3

私の角張ったプロジェクトでは、私は2つのテーブルを持っています。 テーブルの1つにサービスからのデータがロードされ、ngOnInitでこのデータが返されます。要素の幅を計算する関数を呼び出すタイミングは?

私はヘッダー列の幅を計算し、別の表に適用しています。 そして、私は上this.resizeColumn()関数を呼び出します。

ngAfterViewInit() { 
this.resizeColumns();  
} 

も:

@HostListener('window:resize') 
onResize() { 
this.resizeColumns(); 
} 

問題は、ページが初めて開かれたときに、幅がそれが計算されていること、ですまだ適用されていません。 ウィンドウのサイズを変更すると、2つのヘッダーが一致します。 テーブルの幅が変わるたびに、この関数も呼び出されるという考えがあります。 最初に両方のテーブルの列幅が同じになるように、どのイベントまたはライフサイクルフックをresizeColumnを呼び出す必要がありますか?

+0

この質問を見て、受け入れ答えhttps://stackoverflow.com/questions/47729202/change-element-width-dynamically-のコメントを持って、私には正確に重複していないようですが、オンアングル-5 –

+0

ありがとうございます。私はそれを読んで、受け入れられた答えと同じコードを試しました。しかし、それは私の問題を解決しません。 ウィンドウのサイズを変更するとすぐに、テーブルヘッダーに値が設定されるためです。 私はこのようなものを実装しようとしています: [link](https://jsfiddle.net/pu4q1931/3/)しかし、それがJSを持っているので、フィディドにはその問題がないことがわかります。私は角度を変えて同じようにする方法を知らないので、プログラムが実行されるとすぐに、それらの幅が必要になります。 –

+0

その場合、問題を見つけようとしましょう。だから、ページ内のコードを開くとき、幅は正しく計算されていますが、適用しないか、サイズを変更するまで利用できませんか? –

答えて

0

プロパティバインドを利用して、2つのテーブルの列幅をリンクすることができます(this plunker)。私の例では、トップテーブルのカラム幅は一定の間隔で増加し、ボトムテーブルのカラム幅はプロパティバインディングに従って続きます。

<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; 
} 


更新:あなたは(角度例外を回避するために)変更を非同期に行うために必要がある場合は、次のコードを試すことができます

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]; 
} 
+0

しかし、私はプロパティのバインディングで列の幅を変更しています。問題は、元の列ヘッダーが内容に基づいて幅を取得することです。 最初にアプリケーションを起動すると、分割されたテーブルにはデータがありません(対象の列は元の列の列幅を取得します) テーブルがデータを取得し、元の列の幅が拡張されます。ターゲット列は同じままです。 私が理解しようとしているのは、元のテーブルの列が変更されたときに常に、対象の列の幅を変更する方法です。 @ViewChildrenを使用してネイティブエレメントを取得しています –

+0

私はこの関数を以前に変更しました:[リンク](https://stackoverflow.com/questions/47729202/change-element-width-dynamically-on-angular-5 ) そして、テーブルを変更して計算を開始して幅を取得する方法がわかりません。 –

+0

私の例では、表2の幅は表1の実際の幅にリンクされています(offsetWidthで測定)。表1の幅がコンテンツに適合するように変更された場合は、表2の幅がプロパティバインディングの助けを借りて行われます。私は[Plunker](https://plnkr.co/edit/NuRo3WBwAwwmdpsrwwOM?p=preview)を変更して、表1のコンテンツ変更の結果を表示しました。このプロパティバインディングでは、イベントを監視し、最初のテーブルの幅がいつ変更されるかを知る必要はありません。角度変化の検出メカニズムは、あなたのためにそれを処理します。 – ConnorsFan

関連する問題