私はデータテーブルコンポーネントを作成しています。アクセシビリティのために、各テーブルヘッダーにtitle
属性を使用してツールチップを付ける必要があります。ツールヒントの値は明示的に設定することができます(ヘッダーのテキストと異なる場合)。しかし、デフォルトでは、内部テキストが何であれ使用する必要があります。子コンテンツに基づいてコンポーネントのプロパティを更新するにはどうすればよいですか?
私はハーフワーキングのソリューションを持っていますが、これはうまく機能しません。この方法でいくつかの角度ルールを破っているかどうかわかりません。私は、私は後でそれを参照することができますheaderContent
でのdivタグ付けしています
<div #headerContent [attr.title]="title"><ng-content></ng-content></div>
:
は、ここに私の省略コンポーネントのhtmlです。
@Component({ ... })
export class TableHeaderComponent implements AfterContentInit {
@ViewChild('headerContent') headerContent: ElementRef;
@Input() title: string;
ngAfterContentInit() {
if (!this.title) {
this.title = this.headerContent.nativeElement.textContent.trim();
}
}
}
考えは全くtitle
が指定されていない場合、div
を見て、title
のためにそれを使用して、そのテキストの内容をつかむことです:
OK]をクリックして、今ここに簡略コンポーネントクラスです。
これはブラウザでテストするとうまく動作します。
使用例:ここでは
<th table-header>Contact</th>
、私はtitle
を指定していなかったので、それはtitle
としてContact
使用する必要があります。
しかし、私はこのコンポーネントのユニットテストを書くとき、それはと吹く:私はここで間違ってやっているかわからないんだけど
Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'undefined'. Current value: 'Contact'
。
EDIT:ChangeDetectorRef
をコンポーネントクラスに注入し、プロパティを更新した後にdetectChanges()
を呼び出すと、問題が修正されたようです。これはブラウザで動作し、ユニットテストもパスします。
このようにするには、Angularのルールを破っているのでしょうか。
これは 'ngOnInit'で行う必要があります。理由についての詳細は、この質問の[https://stackoverflow.com/questions/43375532/expressionchangedafterithasbeencheckederror-explained]を参照してください。 – 0mpurdy
しかし、' ngOnInit '、' @ ViewChild'はまだ初期化されていませんか? 'ngAfterViewInit'ではそれは起こりませんか?これを試したところ、 'ngOnInit()'の 'this.headerContent'は' undefined'です。 –
私はできるだけ '@ ViewChild'を使わないことを認めなければなりません、私は通常このタスクを達成する別の方法を見つけようとしています。この問題をテストするためにプランカを作成しようとします:) – 0mpurdy