无法读取未定义的 属性 'disable':this.ngControl.control 在 Ivy 中未定义
Cannot read property 'disable' of undefined: this.ngControl.control is undefined in Ivy
就像 this issue states 一样,如果您尝试使用指令访问 ngControl.control:
export class DisabledDirective {
@Input()
set opDisabled(condition: boolean) {
const action = condition ? 'disable' : 'enable';
this.ngControl.control[action]();
}
constructor(private ngControl: NgControl) {}
}
您将在第一次渲染时遇到错误:
core.js:5828 ERROR TypeError: Cannot read property 'disable' of undefined
给定 link 中的解决方案非常老套且不可靠。
在他们解决问题之前,只需在第一次渲染时用 if-s 保护表达式:
export class DisabledDirective {
@Input()
set opDisabled(condition: boolean) {
const action = condition ? 'disable' : 'enable';
if(this.ngControl?.control){
this.ngControl.control[action]();
}
}
constructor(private ngControl: NgControl) {}
}
ps.: 注意新的 safe/elvis 运算符,您也可以在 TS 代码中的 Angular 9 中使用它:)
解决方案是使用 OnChanges 生命周期(在官方问题中提到)
@Directive({ selector: '([formControlName], [formControl])[disableControl]' })
export class DisableControlDirective implements OnChanges {
@Input() disableControl = false;
ngOnChanges(changes: SimpleChanges) {
if (changes.disableControl) {
this.ngControl.control?.disable();
} else {
this.ngControl.control?.enable();
}
}
constructor(private ngControl: NgControl) {}
}
用法会像
<input formControlName="id" [disableControl]="true" />
就像 this issue states 一样,如果您尝试使用指令访问 ngControl.control:
export class DisabledDirective {
@Input()
set opDisabled(condition: boolean) {
const action = condition ? 'disable' : 'enable';
this.ngControl.control[action]();
}
constructor(private ngControl: NgControl) {}
}
您将在第一次渲染时遇到错误:
core.js:5828 ERROR TypeError: Cannot read property 'disable' of undefined
给定 link 中的解决方案非常老套且不可靠。
在他们解决问题之前,只需在第一次渲染时用 if-s 保护表达式:
export class DisabledDirective {
@Input()
set opDisabled(condition: boolean) {
const action = condition ? 'disable' : 'enable';
if(this.ngControl?.control){
this.ngControl.control[action]();
}
}
constructor(private ngControl: NgControl) {}
}
ps.: 注意新的 safe/elvis 运算符,您也可以在 TS 代码中的 Angular 9 中使用它:)
解决方案是使用 OnChanges 生命周期(在官方问题中提到)
@Directive({ selector: '([formControlName], [formControl])[disableControl]' })
export class DisableControlDirective implements OnChanges {
@Input() disableControl = false;
ngOnChanges(changes: SimpleChanges) {
if (changes.disableControl) {
this.ngControl.control?.disable();
} else {
this.ngControl.control?.enable();
}
}
constructor(private ngControl: NgControl) {}
}
用法会像
<input formControlName="id" [disableControl]="true" />