Angular 2 How to “watch” for tab changes

前端 未结 5 1296
一生所求
一生所求 2020-12-10 00:52

I have:


  
    

Some tab content

相关标签:
5条回答
  • 2020-12-10 01:10

    Documentation says, that the content of the you tab is not injected into the DOM until the tab is activated. So, you may catch DOM events on you components with @HostListener annotation:

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

    Component:

    @Component({selector: 'my-cool-tab1', ...})
    export class MyCoolTab1Component {
    
      @HostListener('DOMNodeInsertedIntoDocument')
      foo() {
        console.log('Tab activated');
      }
    
      @HostListener('DOMNodeRemovedFromDocument')
      foo2() {
        console.log('Tab deactivated');
      }
    }
    

    update: this not works in FF %(

    0 讨论(0)
  • 2020-12-10 01:11

    You could use the (selectedTabChange) event. Check Material2#tabs.

    Template:

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

    Component:

    import { MatTabChangeEvent } from '@angular/material';
    
    // ...
    
    onLinkClick(event: MatTabChangeEvent) {
      console.log({ event });
    
      this.router.navigate(['contacts']); 
    }
    
    0 讨论(0)
  • 2020-12-10 01:13

    You need to publish the event as an @Output from you md-tab component. Something like:

    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();
        }
    }
    

    Then you consume that event in the md-tab-group, something like this:

    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;
        }
    }
    

    Heres a working plunker that demonstrates the concept

    0 讨论(0)
  • 2020-12-10 01:22

    You can use ngKeypress ( Angular Documentation here) into any HTML tag. For example:

    <anyHtmlTag ng-keypress="yourFunction($event)">  
    
    yourFunction(evt){
       if(evt.code === "Tab"){
          //Do your stuff
       }
    }
    
    0 讨论(0)
  • 2020-12-10 01:23

    it can be done easily as follows

     <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>
    

    only thing to do is defining a global variable in your component.

     export class MyComponent implements OnInit{   
     selectedTabIndex=0;
         ngOnInit(){
             // 
           }
        }
    
    0 讨论(0)
提交回复
热议问题