自定义禁用指令不起作用 angular
Custom Diasble Directive not working angular
我正在尝试创建一个自定义指令来禁用表单字段,但它不起作用。
import { Directive, Input, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[appCustomDisable]',
})
export class CustomDisableDirective {
@Input() appCustomDisable: boolean;
constructor(private el: ElementRef, private renderer: Renderer2) {}
ngOnChanges() {
if (this.appCustomDisable) {
this.renderer.setProperty(this.el.nativeElement, 'disabled',
this.appCustomDisable);
} else {
this.renderer.setProperty(this.el.nativeElement, 'disabled',
this.appCustomDisable);
}
}
}
我也尝试过使用来自“@angular/core”的渲染
this.renderer.setElementAttribute(this.el.nativeElement, 'disabled',
'true');
在app.component.html
我正在使用像
[appCustomDisable]="myVar"
Stackblitz link
https://stackblitz.com/edit/angular-lxb661
由于您使用的是 MatInput,因此您的代码将无法使用。但是你可以像这样简单地调整它:
import { Directive, ElementRef, Input, Renderer2, Optional, S } from '@angular/core';
import { MatInput } from '@angular/material'
@Directive({
selector: '[appCustomDisable]'
})
export class CustomDisableDirective {
@Input() appCustomDisable: string;
constructor(@Optional() private matInput: MatInput, private el: ElementRef, private renderer: Renderer2) { }
ngOnChanges() {
// Find Input
let input: any;
if (this.matInput) {
// It's a Material Input
input = this.matInput;
}
else {
// Its a native Input
if (this.el.nativeElement && this.el.nativeElement.tagName && this.el.nativeElement.tagName === "INPUT") {
input = this.el.nativeElement;
} else {
// No Input found
// return or throw error
return;
}
}
if (this.appCustomDisable === 'hide') {
this.renderer.setStyle(this.el.nativeElement, 'display', 'none')
} else if (this.appCustomDisable === 'view') {
console.log(input);
input.disabled = true;
}
else {
this.renderer.setStyle(this.el.nativeElement, 'display', 'block')
}
}
}
显然,您要禁用的是存在于同一元素上的 MatInput 指令。所以,只需将它注入您的组件,然后禁用它:
import { Directive, Input } from '@angular/core';
import { MatInput } from '@angular/material';
@Directive({
selector: '[appCustomDisable]'
})
export class CustomDisableDirective {
@Input() appCustomDisable : boolean;
constructor(private matInput: MatInput) {}
ngOnChanges() {
this.matInput.disabled = this.appCustomDisable;
}
}
我正在尝试创建一个自定义指令来禁用表单字段,但它不起作用。
import { Directive, Input, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[appCustomDisable]',
})
export class CustomDisableDirective {
@Input() appCustomDisable: boolean;
constructor(private el: ElementRef, private renderer: Renderer2) {}
ngOnChanges() {
if (this.appCustomDisable) {
this.renderer.setProperty(this.el.nativeElement, 'disabled',
this.appCustomDisable);
} else {
this.renderer.setProperty(this.el.nativeElement, 'disabled',
this.appCustomDisable);
}
}
}
我也尝试过使用来自“@angular/core”的渲染
this.renderer.setElementAttribute(this.el.nativeElement, 'disabled',
'true');
在app.component.html 我正在使用像 [appCustomDisable]="myVar"
Stackblitz link https://stackblitz.com/edit/angular-lxb661
由于您使用的是 MatInput,因此您的代码将无法使用。但是你可以像这样简单地调整它:
import { Directive, ElementRef, Input, Renderer2, Optional, S } from '@angular/core';
import { MatInput } from '@angular/material'
@Directive({
selector: '[appCustomDisable]'
})
export class CustomDisableDirective {
@Input() appCustomDisable: string;
constructor(@Optional() private matInput: MatInput, private el: ElementRef, private renderer: Renderer2) { }
ngOnChanges() {
// Find Input
let input: any;
if (this.matInput) {
// It's a Material Input
input = this.matInput;
}
else {
// Its a native Input
if (this.el.nativeElement && this.el.nativeElement.tagName && this.el.nativeElement.tagName === "INPUT") {
input = this.el.nativeElement;
} else {
// No Input found
// return or throw error
return;
}
}
if (this.appCustomDisable === 'hide') {
this.renderer.setStyle(this.el.nativeElement, 'display', 'none')
} else if (this.appCustomDisable === 'view') {
console.log(input);
input.disabled = true;
}
else {
this.renderer.setStyle(this.el.nativeElement, 'display', 'block')
}
}
}
显然,您要禁用的是存在于同一元素上的 MatInput 指令。所以,只需将它注入您的组件,然后禁用它:
import { Directive, Input } from '@angular/core';
import { MatInput } from '@angular/material';
@Directive({
selector: '[appCustomDisable]'
})
export class CustomDisableDirective {
@Input() appCustomDisable : boolean;
constructor(private matInput: MatInput) {}
ngOnChanges() {
this.matInput.disabled = this.appCustomDisable;
}
}