Reputation: 6752
I want to get which tab is active. I tried to use a @ViewChild
decorator and accessing the element properties that way, but it returns null
.
Component:
import {Component, OnInit, ViewChild} from '@angular/core';
@Component({
selector: 'material-app',
template: `
<md-tab-group #tabGroup>
<md-tab label="Tab 1">Content 1</md-tab>
<md-tab label="Tab 2">Content 2</md-tab>
</md-tab-group>
`
})
export class AppComponent implements OnInit {
@ViewChild('tabGroup') tabGroup;
constructor() {
}
ngOnInit() {
console.log(this.tabGroup); // MdTabGroup Object
console.log(this.tabGroup.selectedIndex); // null
}
}
Upvotes: 55
Views: 126803
Reputation: 1
tabs.component.ts
import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';
import { MaterialModule } from '../material/material.module';
@Component({
selector: 'app-tabs',
standalone: true,
imports: [MaterialModule],
templateUrl: './tabs.component.html',
styleUrl: './tabs.component.scss'
})
export class TabsComponent implements AfterViewInit {
selectedIndex: number | null = null;
constructor(private cdr: ChangeDetectorRef) {}
logChange(index: number | null) {
if(index !== null) {
this.selectedIndex = index;
console.log(index);
}
}
ngAfterViewInit() {
setTimeout(() => {
this.selectedIndex = 0;
this.cdr.detectChanges();
});
}
}
tabs.component.html
<!-- tabs allow us to organise content intercepted view where only one view is visible at a given time -->
<!-- want to perform in the tabs when we changing the tabs -->
<mat-tab-group #tabRef (selectedTabChange)="logChange(tabRef.selectedIndex)">
<mat-tab label="Angular">Angular Content</mat-tab>
<mat-tab label="React">React Content</mat-tab>
<mat-tab label="Vue">Vue Content</mat-tab>
</mat-tab-group>
<!-- if we want to know which tab is active at any point of time -->
<!-- {{tabRef.selectedIndex}} -->
{{selectedIndex}}
general solution of the problem as per the latest versions of the angular material and angular respectively.
Upvotes: 0
Reputation: 1018
By default tab with index 0 is shown by mat-tab-group. later on as and when the other tab is selected, the index also changes. This can be detected by MatTabChangeEvent
HTML Content
<mat-tab-group (selectedTabChange)="onTabChange($event)">
<mat-tab label="First Tab">
<p>Hello, Tab 0</p>
</mat-tab>
<mat-tab label="Second Tab">
<p>Hello, Tab 1</p>
</mat-tab>
<mat-tab label="Third Tab">
<p>Hello, Tab 2</p>
</mat-tab>
</mat-tab-group>
.ts file content
onTabChange(event : MatTabChangeEvent) {
console.log(event.index);
// do something based on selected tab index
}
Upvotes: 0
Reputation: 17452
This is how you can get active index
of active angular material
tabs
.html
file
<div>
<mat-tab-group #tabRef (selectedTabChange)="logChange(tabRef.selectedIndex)">
<mat-tab label="ALL"></mat-tab>
<mat-tab label="Delivered"></mat-tab>
<mat-tab label="Pending"></mat-tab>
<mat-tab label="Cancelled"></mat-tab>
</mat-tab-group>
</div>
.ts
file
logChange(index)
{
console.log(index);
}
Don't forget to add import in app.module.ts
file
import { MatTabsModule } from '@angular/material/tabs';
Upvotes: 1
Reputation: 24894
Well, I'm not sure if I understood well your question because, by default the index always starts counting from zero unless you set manually the [selectedIndex] property
.
Anyway, if you really want to see which tab is selected on initialization you could implement the AfterViewInit
interface and do the following:
export class AppComponent implements AfterViewInit, OnInit {
...
ngAfterViewInit() {
console.log('afterViewInit => ', this.tabGroup.selectedIndex);
}
}
On other hand, if you want to check which tab is selected based on changes (what makes more sense), here you go:
HTML:
<mat-tab-group #tabGroup (selectedTabChange)="tabChanged($event)">
<mat-tab label="Tab 1">Content 1</mat-tab>
<mat-tab label="Tab 2">Content 2</mat-tab>
</mat-tab-group>
Component:
tabChanged(tabChangeEvent: MatTabChangeEvent): void {
console.log('tabChangeEvent => ', tabChangeEvent);
console.log('index => ', tabChangeEvent.index);
}
Upvotes: 97
Reputation: 2952
"@angular/material": "^6.2.1". The way to get selected tab index on-load (after template has loaded) and when the tab is focused.
my.component.ts
export class MyComponent implements OnInit, AfterViewInit {
@ViewChild('tabGroup') tabGroup;
ngAfterViewInit() {
console.log(this.tabGroup.selectedIndex);
}
public tabChanged(tabChangeEvent: MatTabChangeEvent): void {
console.log(tabChangeEvent);
}
}
my.component.html
<mat-tab-group #tabGroup (focusChange)="tabChanged($event)" [selectedIndex]="1">
<mat-tab>
<ng-template mat-tab-label>Tab 1</ng-template>
Tab Content
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>Tab 2</ng-template>
Tab Content
</mat-tab>
</mat-tab-group>
Upvotes: 12
Reputation: 2952
According to Material documentation Angular Material tabs output an event on tab change @Output() selectedTabChange: EventEmitter<MatTabChangeEvent>
Your Template:
<mat-tab-group (selectedTabChange)="tabChanged($event)">
<mat-tab>
<ng-template mat-tab-label>Tab 1</ng-template>
Tab Content
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>Tab 2</ng-template>
Tab Content
</mat-tab>
</mat-tab-group>
Your Typescript:
import { MatTabChangeEvent } from '@angular/material';
public tabChanged(tabChangeEvent: MatTabChangeEvent): void {
console.log(tabChangeEvent);
}
Upvotes: 22