最近、プロジェクトを Angular 15.1 にアップグレードしたところ、新たな問題に気付きました。
ページには、ルーティングを介してサブページを開く mat-tab-nav があります。
<nav mat-tab-nav-bar color="primary">
<a mat-tab-link *ngFor="let link of navLinks" [routerLink]="link.link" routerLinkActive #rla="routerLinkActive" [active]="rla.isActive">{{link.label}}< /a>
</nav>
<router-outlet></router-outlet>
アップデート後はすべて正常に動作しますが、コンソールにエラーが表示されます。mat-tab-nav-panel は [tabPanel] で指定する必要があります。「
Angularコードを見てみましょう(385行目)https://github.com/angular/components/blob/main/src/material/tabs/tab-nav-bar/tab-nav-bar.tsコードは次のようになります:
override ngAfterViewInit() {
if (!this.tabPanel && (typeof ngDevMode === 'undefined' || ngDevMode)) {
throw new Error('A mat-tab-nav-panel must be specified via [tabPanel].');
}
super.ngAfterViewInit();
}
ドキュメントより(https://material.angular.io/components/tabs/apitabPanel) の場合、tabPanel が null になる可能性があるようです。
tabPanel: ナビゲーション バーによって制御される関連タブ パネル。指定されていない場合、ナビゲーション バーは ARIA リンク/ナビゲーション ランドマーク パターンに従います。指定されている場合は、ARIA タブ デザイン パターンに従います。
コードに役に立たない mat-tab-nav-panel を追加することで修正しました。
<nav mat-tab-nav-bar color="primary" [tabPanel]="tabPanel">
<a mat-tab-link *ngFor="let link of navLinks" [routerLink]="link.link" routerLinkActive #rla="routerLinkActive" [active]="rla.isActive">{{link.label}}< /a>
</nav>
<mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>
<router-outlet></router-outlet>
これは正しい方法でしょうか? Angular コンポーネントのバグのように思えます。どう思いますか?
ベストアンサー1
私の意見では、ルーターのコンセントを次のように包む必要があります<mat-tab-nav-panel>
:
<nav mat-tab-nav-bar color="primary" [tabPanel]="tabPanel">
<a mat-tab-link *ngFor="let link of navLinks" [routerLink]="link.link" routerLinkActive #rla="routerLinkActive" [active]="rla.isActive">{{link.label}}< /a>
</nav>
<mat-tab-nav-panel #tabPanel>
<router-outlet></router-outlet>
</mat-tab-nav-panel>
文書には次のように記されている
「対応するものはコンポーネント<router-outlet>
にラップする必要があり<mat-tab-nav-panel>
、通常は mat-tab-nav-bar の比較的近くに配置する必要があります (アクセシビリティを参照)。」
見るAngular Material タブ: タブとナビゲーション
ただし、Angular チームのコード例には現在 Router-Outlet がありません。