Angular:使用指令禁用Material按钮无效

7

我想通过一个指令来禁用一些按钮(给按钮添加disabled属性)。

这个指令可以作用于普通的HTML按钮,但是对于Angular Material Design按钮(mat-button)则不起作用:

import { Component, Directive, ElementRef, Renderer2 } from '@angular/core';


@Directive({
  selector: '[myDisableButton]'
})
export class HideCantEditDirective {
  constructor(private el: ElementRef, private renderer: Renderer2) {
    // try with Renderer2
    this.renderer.setProperty(this.el.nativeElement, 'disabled', true);
    // try with ElementRef
    this.el.nativeElement.disabled = true;

    this.renderer.setStyle(this.el.nativeElement, 'border', '2px solid green');
  }
}



@Component({
  selector: 'my-app',
  template: `
  <button mat-button myDisableButton (click)="onClick()">Material Button</button><br /><br />
  <button myDisableButton (click)="onClick()">Classic Button</button>`,
  styles: [ 'button:disabled { border: 2px solid red !important; }' ]
})
export class AppComponent  {

  onClick(){
    alert('ok');
  }
}

输出:

输入图像描述

在Stackblitz上查看: https://stackblitz.com/edit/angular-5xq2wm

1个回答

7

如果将mat-button放在按钮元素上,它将被内部投影到mat-button组件中。由于是内容投射,您无法在构造函数中设置disable=true。

可以尝试使用AfterViewInit。

import { Component, Directive, ElementRef, Renderer2, AfterViewInit } from '@angular/core';


@Directive({
  selector: '[myDisableButton]'
})
export class HideCantEditDirective implements AfterViewInit {
  constructor(private el: ElementRef, private renderer: Renderer2) {
    // try with Renderer2
    this.renderer.setProperty(this.el.nativeElement, 'disabled', true);

  }

  ngAfterViewInit(){
   // try with ElementRef
    this.el.nativeElement.disabled = true;

    this.renderer.setStyle(this.el.nativeElement, 'border', '2px solid green');
  }
}

分支示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接