Angular 2 Как следить за изменениями вкладок

У меня есть:

<md-tab-group color="primary">
  <md-tab label="Проэкты">
    <h1>Some tab content</h1>
  </md-tab>
  <md-tab label="Обучалка">
    <h1>Some more tab content</h1>
    <p>...</p>
  </md-tab>
</md-tab-group>

Мне нужно поймать событие при нажатии на определенную вкладку и вызвать эту функцию внутри моего компонента:

onLinkClick() {
  this.router.navigate(['contacts']); 
}

person Igor Tikhonenko    schedule 06.02.2017    source источник
comment
Кажется, что нет события tabChanging, указывающего, что вкладка только что была нажата, чтобы вы могли подготовиться к изменению. Это действительно должно быть запросом функции :-) Как «tabGuard», похожий на облегченную защиту маршрута.   -  person Simon_Weaver    schedule 24.02.2019


Ответы (5)


Вы можете использовать (selectedTabChange) событие. Проверьте Material2#tabs.

Шаблон:

<mat-tab-group color="primary" (selectedTabChange)="onLinkClick($event)">
  ...
</mat-tab-group>

Компонент:

import { MatTabChangeEvent } from '@angular/material';

// ...

onLinkClick(event: MatTabChangeEvent) {
  console.log({ event });

  this.router.navigate(['contacts']); 
}
person developer033    schedule 06.02.2017
comment
Это хорошо, но с вкладкой навигации, без ‹mat-tab-group› не работает. Есть ли событие для получения этого события, когда мы используем директиву mat-tab-nav-bar для элемента навигации? - person nevradub; 01.03.2018
comment
импортировать {MatTabChangeEvent} из '@angular/material/tabs'; правильный импорт в соответствии с последними модулями Angular Material - person Karthik H; 30.01.2021

Вам нужно опубликовать событие как @Output от вашего md-tab компонента. Что-то типа:

import { EventEmitter, Output, Input, Component } from '@angular/core';

@Component({
    selector: 'tab',
    template: `
        <button (click)="clicked()">{{ name }}</button>
    `,
    styles: [`
    `]
})
export class TabComponent {
    @Input() name = 'replaceme';
    @Output() tabClicked = new EventEmitter<null>();

    clicked() {
        this.tabClicked.emit();
    }
}

Затем вы используете это событие в md-tab-group примерно так:

import { Component }          from '@angular/core';

@Component({
    selector: 'tab-group',
    template: `
        <!--<tab *ngFor="let tab of tabs" [name]="tab"></tab>-->
        <tab *ngFor="let tab of tabs" [name]="tab" (tabClicked)="tabChanged(tab)"></tab>
        <div>
        {{ selectedTab }}
        </div>
    `,
    styles: [`
    `]
})
export class TabGroupComponent {
    private tabs = ['foo', 'bar'];
    private selectedTab = this.tabs[0];

    onInit() {
        this.selectedTab = this.tabs[0];
    }

    tabChanged(tab) {
        this.selectedTab = tab;
    }
}

Вот рабочий плункер, демонстрирующий концепцию

person Lucas    schedule 06.02.2017

В документации говорится, что содержимое вашей вкладки не вводится в DOM до тех пор, пока вкладка не будет активирована. Таким образом, вы можете перехватывать события DOM на своих компонентах с помощью аннотации @HostListener:

<md-tab-group color="primary">
  <md-tab label="Проэкты">
    <my-cool-tab1></my-cool-tab1>
  </md-tab>
  ...
</md-tab-group>

Составная часть:

@Component({selector: 'my-cool-tab1', ...})
export class MyCoolTab1Component {

  @HostListener('DOMNodeInsertedIntoDocument')
  foo() {
    console.log('Tab activated');
  }

  @HostListener('DOMNodeRemovedFromDocument')
  foo2() {
    console.log('Tab deactivated');
  }
}

обновление: это не работает в FF %(

person chabapok    schedule 21.04.2020

это можно легко сделать следующим образом

 <md-tab-group color="primary" (click)="selectedTabIndex=tabRef.selectedIndex" #tabRef>
      <md-tab label="Проэкты">
        <h1>Some tab content</h1>
      </md-tab>
      <md-tab label="Обучалка">
        <h1>Some more tab content</h1>
        <p>...</p>
      </md-tab>
    </md-tab-group>

Единственное, что нужно сделать, это определить глобальную переменную в вашем компоненте.

 export class MyComponent implements OnInit{   
 selectedTabIndex=0;
     ngOnInit(){
         // 
       }
    }
person Javid Gahramanov    schedule 20.04.2020

Вы можете использовать ngKeypress (документация Angular здесь) в любой тег HTML. Например:

<anyHtmlTag ng-keypress="yourFunction($event)">  

yourFunction(evt){
   if(evt.code === "Tab"){
      //Do your stuff
   }
}
person heronsanches    schedule 10.08.2018
comment
Этот вопрос касается Angular, а не AngularJs. - person developer033; 20.10.2019