Маршрутизатор Перейдите на вкладки ngx-bootstrap Angular 4

У меня есть компонент с четырьмя вкладками (с использованием вкладок ngx-bootstrap) myprod, mysettings и т. Д. и я создал четыре разных маршрута для каждой вкладки (указывающих на один и тот же компонент). и я использовал приведенный ниже код для отображения правой вкладки при загрузке страницы.

[routerLink]="['/user/my-account']" [routerLinkActive]="'active is-active'"

но, к сожалению, каждый раз, когда активный класс будет добавлять в первую вкладку не нужную. Если я использую любое другое имя класса вместо active, оно работает так, как я ожидал, пожалуйста, помогите.

введите описание изображения здесь

введите описание изображения здесь


person Sebin Simon    schedule 14.11.2017    source источник


Ответы (3)


попробуй это

 <tab   
  [routerLink]="['/user/my-account']"
  routerLinkActive 
  #ads="routerLinkActive"
  [active]="ads.isActive">  
</tab>
person Fateh Mohamed    schedule 14.11.2017
comment
добавлено, но по-прежнему отображается первая вкладка вместо третьей - person Sebin Simon; 14.11.2017
comment
вы добавляете их в элемент ‹a› ?? не могли бы вы показать мне HTML, пожалуйста - person Fateh Mohamed; 14.11.2017
comment
Я добавил снимок экрана в свой вопрос, я хочу сделать его активным на вкладке настроек, когда пользователь посещает URL-адрес «мои настройки» - person Sebin Simon; 14.11.2017
comment
как в примере выше, удалите [routerLink] из вкладки и добавьте его в элемент внутри вкладки. - person Fateh Mohamed; 14.11.2017
comment
и удалите [routerLinkActiveOptions] = {exact: true}. - person Fateh Mohamed; 14.11.2017
comment
Позвольте нам продолжить это обсуждение в чате. - person Sebin Simon; 14.11.2017
comment
Я обновил ответ, я попытался назначить экземпляр RouterLinkActive переменной шаблона и напрямую проверить статус isActive и установить активное свойство на основе этого. это должно работать - person Fateh Mohamed; 14.11.2017

Вид позднего ответа, но для будущих людей ищут:

HTML:

  <tabset class="nav nav-tabs">
    <ng-container *ngFor="let template of templates">
      <tab #tab="routerLinkActive" 
           (selectTab)="(!template.disabled || firstSelection) && routeChange(template.appRouterLink)"
           [active]="tab.isActive" 
           [customClass]="template.disabled && template.hideDisabled ?
            'd-none' : template.disabled ? 'disabled' : ''" 
           [heading]="template.labelKey | translate"
           [routerLink]="template.appRouterLink" 
           routerLinkActive="active">
      </tab>
    </ng-container>
  </tabset>

  <div class="tab-content">
    <div class="tab-pane active">
      <router-outlet></router-outlet>
    </div>
  </div>

TS:

  @ContentChildren(TabsDirective) public templates: QueryList<TabsDirective>;
  private firstSelection = true;

  public constructor(private router: Router, private route: ActivatedRoute) {
  }

  public async routeChange(appRouterLink: any[] | string): Promise<any> {
    if (this.firstSelection) {
      this.firstSelection = false;

    } else {
      const route = appRouterLink instanceof Array ? appRouterLink : [appRouterLink];
      this.router.navigate(route, {relativeTo: this.route});
    }
  }

И директива:

@Directive({selector: '[appTabs]'})
export class TabsDirective {
  @Input() public disabled: boolean;
  @Input() public hideDisabled: boolean;
  @Input() public labelKey: string;
  @Input() public appRouterLink: any[] | string | null | undefined;
}

Пример использования:

 <app-nav>
   <ng-template [disabled]="!can_see_info" appRouterLink="info"
             appTabs labelKey="INFO"></ng-template>

   <ng-template [disabled]="!can_see_events || !company?.id" appRouterLink="events"
             appTabs labelKey="EVENTS"></ng-template>
 </app-nav>

Несколько замечаний о том, почему код такой:

  • Если вы используете свойство disabled в теге вкладки и для начального значения установлено значение true, но позже оно будет изменено, он отклонит триггер события выбора, что приведет к тому, что вкладка не будет отображаться как выбранная.
  • Если вы используете * ngIf в теге вкладок, порядок вкладок может быть испорчен, если вы скроете одну, а затем снова покажете ее (своего рода поведение FIFO).
person Gonçalo Alves    schedule 18.09.2020

Вот как вы можете программно изменять вкладки с маршрутизацией

component.html

<tabset>
    <tab *ngFor="let m of menu; let i = index" [active]="m.active" [heading]="m.title" (selectTab)="tabSelected(m.url)">
        <component-a *ngIf="i == 0"></component-a>
        <component-b *ngIf="i == 1"></component-b>
        <component-c *ngIf="i == 2"></component-c>
    </tab>
</tabset>

component.ts

  menu: Array<IMenu>
  constructor(private router: Router) { }

  ngOnInit(): void {
    this.initMenu()
    this.onPageLoad()
  }

  initMenu() {
    this.menu = [
      {
        title: 'Tab 1',
        url: '/tab-1',
        active: true   // default active tab
      },
      {
        title: 'Tab 2',
        url: '/tab-2',
        active: false
      },
      {
        title: 'Tab 3',
        url: '/tab-3',
        active: false
      }
    ]
  }

  // activate tab based on url when page loads
  onPageLoad() {
    this.menu.forEach(m => m.active = false)
    let _selected_menu = this.menu?.find(x => x.url.includes(this.router.url))

    if (_selected_menu) {
      _selected_menu.active = true
    }
  }

  // change url when user selects tab
  tabSelected(url: string) {
    this.router.navigateByUrl(url)
  }
person WasiF    schedule 06.11.2020