我使用的是Angular 11和一个带有表单组的表单。我的表单中有几个字段,我希望根据外部环境设置这些字段的启用/禁用。这适用于预期的输入域。
我在堆栈闪电战中做了一个简单的例子:https://stackblitz.com/edit/my-cb-test?file=src/app/app.component.html
我做了什么,我有我的应用程序-Component.ts:
import { Component, VERSION } from "@angular/core";
import { FormGroup, FormBuilder, Validators } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
name = "Angular " + VERSION.major;
bvalue = true;
disbled = false;
form: FormGroup;
constructor(private fb: FormBuilder) {
this.buildFormGroup(this.disbled);
}
buildFormGroup(dis: boolean): void {
this.form = this.fb.group({
firstCB: [
{ value: this.bvalue, disabled: dis },
[Validators.requiredTrue]
],
inputField: [{ value: "Test", disabled: dis }, [Validators.required]]
});
}
switch(): void {
this.disbled = !this.disbled;
console.log("Disabled: " + this.disbled);
this.buildFormGroup(this.disbled);
}
}
和我的html:
<form [formGroup]="form">
<div>
<mat-checkbox formControlName="firstCB">
Checkbox
</mat-checkbox>
</div>
<mat-form-field>
<input matInput formControlName="inputField" type="text" />
</mat-form-field>
<button (click)="switch()">Click</button>
</form>
当我单击该按钮时,输入字段如预期的那样被启用/禁用,但复选框保持启用状态(或者更准确地说,是它具有的第一个状态)。
你知道这里出了什么问题吗?
编辑:我知道我可以在超文本标记语言中使用disabled="condition“,但这被认为是不好的做法,并在控制台中给出了警告……
发布于 2021-03-11 17:41:07
我没有时间深入研究MatCheckbox代码,但它似乎对FormControl绑定的重新分配没有反应。如果您尝试重用相同的表单(和表单控件)并简单地启用/禁用整个表单(或特定的FormControl),您将看到它被正确禁用。不确定这是否是您可以接受的变通方法。
尝试在angular material repo中提交一份bug报告(或者查看代码--也许它正在按预期工作)。
关于你问题下的评论-你不应该把disabled属性和反应式表单绑定混在一起。这是一种糟糕的做法,在为开发中的应用程序提供服务时会抛出警告(还可能导致其他问题,具体取决于您的用例)。
https://stackoverflow.com/questions/66579103
复制相似问题