首页 > 解决方案 > 使用指令隐藏有角度的材料 mat-tab

问题描述

我正在使用角度材质选项卡,我想使用指令来动态隐藏选项卡元素。

html模板

<mat-tab-group>
  <!-- how to hide this using directive? -->
  <mat-tab appHideMe label="First"> Content 1 </mat-tab>
  <!-- like this -->
  <mat-tab *ngIf="false" label="Second"> Content 2 </mat-tab>
  <mat-tab label="Third"> Content 3 </mat-tab>
</mat-tab-group>

<div appHideMe>
  hidden
</div>
<div>
  visible
</div>

HideMe指示

    @Directive({
      selector: '[appHideMe]'
    })
    export class HideMeDirective implements AfterViewInit {
      constructor(
        private el: ElementRef
      ) { }
    
      ngAfterViewInit() {
        this.el.nativeElement.style.display = 'none';
      }
    }

在编译期间,mat-tab被替换所以display = 'none'将不起作用。有什么方法可以隐藏mat-tab*ngIf使用HideMeDirective)?

是一个堆栈闪电战示例。


我也想mat-tab是可切换的。在示例中,我希望third可见,但事实并非如此。

模板

<mat-tab-group>
  <!-- how to hide this using directive? -->
  <div>
    <mat-tab label="First"> Content 1 </mat-tab>
  </div>
  <div appHideMe="hide">
    <mat-tab label="Second"> Content 2 </mat-tab>
  </div>
  <div appHideMe>
    <mat-tab label="Third"> Content 3 </mat-tab>
  </div>
  <div>
    <mat-tab label="Fourth"> Content 4 </mat-tab>
  </div>

</mat-tab-group>

<div appHideMe>
  hidden
</div>
<div>
  visible
</div>

指令代码

    @Directive({
      selector: '[appHideMe]'
    })
    export class HideMeDirective implements AfterViewInit {
    
      @Input() appHideMe: string;
    
      constructor(
        private el: ElementRef
      ) { }
    
      ngAfterViewInit() {
        
        if (this.appHideMe === 'hide') {
          this.el.nativeElement.style.display = 'none';
        }
        // should be displayed
        // this.el.nativeElement.style.display = 'none';
      }
    }

只要没有HideMeDirective放在div上,mat-dat就会显示出来。添加时HideMeDirective(参见第三个mat-tab),元素不可见。有任何想法吗?

标签: htmlangularangular-material2

解决方案


尝试这样的事情

定义一个变量

import { Directive, ElementRef, AfterViewInit,ChangeDetectorRef } from '@angular/core';   
@Directive({
    selector: '[appHideMe]',
    exportAs:'appHideMe',  
})
    
export class HideMeDirective implements AfterViewInit {   
    hide:Boolean;    
    constructor(
        private el: ElementRef,
        private cdr:ChangeDetectorRef
    ) { }
    
    ngAfterViewInit() {
        this.hide=false;
        this.cdr.detectChanges();
    }
}

然后使用模板参考

<mat-tab appHideMe #ref="appHideMe" label="First"> Content 1 </mat-tab>
<mat-tab *ngIf="ref.hide" label="Second"> Content 2 </mat-tab>

示例:https ://stackblitz.com/edit/angular-mqc1co-vlw9aa


推荐阅读