这是我的产品dashboard.html

   <nav #nav>
    <div class="nav nav-tabs" id="nav-tab" role="tablist">
      <button class="nav-link active" id="nav-categories-tab" data-bs-toggle="tab" data-bs-target="#nav-categories" type="button" role="tab" aria-controls="nav-categories" aria-selected="true" (click)="showCategories()" [ngClass]="{ 'active':activeTab==='categories'}">Categories</button>     
      <button class="nav-link" id="nav-product-lists-tab" data-bs-toggle="tab" data-bs-target="#nav-product-lists" type="button" role="tab" aria-controls="nav-product-lists" aria-selected="false"(click)="showProducts()" [ngClass]="{ 'active':activeTab==='products'}">Products</button>
      <button class="nav-link" id="nav-product-details-tab" data-bs-toggle="tab" data-bs-target="#nav-product-details" type="button" role="tab" aria-controls="nav-product-details" aria-selected="false" (click)="showProductDetails()" [ngClass]="{ 'active':activeTab==='product-details'}">Product Details</button>
     </div>
  </nav>

这是我的产品仪表板组件

    export class ProductsDashboardComponent {
    activeTab = 'categories';
    constructor(private router:Router, private route: ActivatedRoute){}
    showCategories(){
      this.router.navigate(['categories'],{relativeTo: this.route})
    }
    showProducts(){
      this.router.navigate(['products'],{relativeTo: this.route})
    }
    showProductDetails(){
      this.activeTab = 'product-details';
      this.router.navigate(['product-details'],{relativeTo: this.route})
    }
  }

现在,当我单击产品详细信息选项卡时,前一个选项卡(即产品选项卡)也显示为活动的,如下所示.那么,如何使Other Tabs类处于非活动状态.

enter image description here

推荐答案

这里有一个更好的方法来同步活动的子元素,这将甚至当我们刷新屏幕时工作,我们可以订阅路由事件,最好是NavigationEnd,然后获得当前的firstChild路径.另外,解决问题的方法可能是从html中删除活动类.

完整代码

import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import {
  ActivatedRoute,
  provideRouter,
  Router,
  RouterModule,
  NavigationEnd,
} from '@angular/router';
import { filter } from 'rxjs/operators';
import 'zone.js';
import { CategoriesComponent } from './categories/categories.component';
import { ProductDetailsComponent } from './product-details/product-details.component';
import { ProductsComponent } from './products/products.component';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, RouterModule],
  template: `
    <nav #nav>
    <div class="nav nav-tabs" id="nav-tab" role="tablist">
      <button class="nav-link" id="nav-categories-tab" data-bs-toggle="tab" data-bs-target="#nav-categories" type="button" role="tab" aria-controls="nav-categories" aria-selected="true" (click)="showCategories()" [ngClass]="{ 'active':activeTab==='categories'}">Categories</button>     
      <button class="nav-link" id="nav-product-lists-tab" data-bs-toggle="tab" data-bs-target="#nav-product-lists" type="button" role="tab" aria-controls="nav-product-lists" aria-selected="false" (click)="showProducts()" [ngClass]="{ 'active':activeTab==='products'}">Products</button>
      <button class="nav-link" id="nav-product-details-tab" data-bs-toggle="tab" data-bs-target="#nav-product-details" type="button" role="tab" aria-controls="nav-product-details" aria-selected="false" (click)="showProductDetails()" [ngClass]="{ 'active':activeTab==='product-details'}">Product Details</button>
     </div>
     <router-outlet/>
  </nav>
  `,
})
export class App {
  activeTab = 'categories';
  constructor(private router: Router, private route: ActivatedRoute) {
    this.router.events.pipe(
      filter(event => event instanceof NavigationEnd)
    ).subscribe(() => {
      this.activeTab = this.route?.snapshot?.firstChild?.routeConfig?.path.split("/")[0] || '';
    })
  }
  showCategories() {
    this.router.navigate(['categories'], { relativeTo: this.route });
  }
  showProducts() {
    this.router.navigate(['products'], { relativeTo: this.route });
  }
  showProductDetails() {
    this.router.navigate(['product-details'], { relativeTo: this.route });
  }
}

bootstrapApplication(App, {
  providers: [
    provideRouter([
      { path: 'categories', component: CategoriesComponent },
      { path: 'products', component: ProductsComponent },
      { path: 'product-details', component: ProductDetailsComponent },
      { path: '', redirectTo: 'categories', pathMatch: 'full' },
    ]),
  ],
});

stackblitz

Angular相关问答推荐

无法绑定到ngIf,因为它不是dis angular 17的已知属性

自动完成搜索过滤器不适用于Angular 中动态添加的输入字段

未在ng bootstrap 模式中设置表单输入

当我更新S显示的数据时,为什么我的垫表用户界面没有更新?

Angular,数据显示在控制台但不在应用程序中

从具有特定 node 值的现有数组创建新数组

Aws 代码部署在 BeforeBlockTraffic 步骤失败,即使在更新策略后也会超时

Angular:如何在根组件中使用 ngx-translate?

如何使用 Angular 12 material 验证密码和确认密码?

Angular 无法从后端获取数据到前端

过滤 ngfor Angular 的计数

有条件地取消所有内部可观察对象或切换到仅发出一个值的新对象

类继承支持

Angular 2.0 中 $scope 的替代品

ViewChild 和 ContentChild 的所有有效 Select 器是什么?

读取文件并解析其内容

如何提高 Angular2 应用程序的加载性能?

交替行 colored颜色 angular material表

Angular2 - 从外部验证和提交表单

使用 EventEmitter 传递参数