使用指令隐藏角材料垫标签

Tom*_*omP 5 html angular-material2 angular

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

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>
Run Code Online (Sandbox Code Playgroud)

HideMe 指示

<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>
Run Code Online (Sandbox Code Playgroud)

在编译过程中,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>
Run Code Online (Sandbox Code Playgroud)

指令代码

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

只要HideMeDirective在div上没有,mat-dat就会显示。当HideMeDirective被添加(见第三mat-tab),元件是不可见的。有任何想法吗?

Che*_*pan 5

尝试这样的事情

定义一个变量

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用模板引用

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

Run Code Online (Sandbox Code Playgroud)

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


Muh*_*gan 0

那这个呢:

<mat-tab-group>
  <mat-tab appHideMe label="First"> Content 1 </mat-tab>
<div appHideMe>
 <mat-tab label="Second"> Content 2 </mat-tab>
</div>

  <mat-tab label="Third"> Content 3 </mat-tab>
</mat-tab-group>
Run Code Online (Sandbox Code Playgroud)