gpt4 book ai didi

angular - 在 Angular 6 中重置响应式表单时不会禁用输入

转载 作者:行者123 更新时间:2023-12-05 06:09:45 24 4
gpt4 key购买 nike

我创建了一个 StackBlitz example我的问题。

我有一个构建表单的FormService,它是由initForm()方法中的组件获取的:-

public getForm() {
return this.fb.group({
cb1: this.fb.control(false),
cb2: this.fb.control(false),
inputBox: this.fb.control({value: '', disabled: true}, Validators.required)
});
}

如果没有选中任何复选框,我需要禁用输入文本框。这让我做了这样的事情:-

if(!this.cb1.value && !this.cb2.value) {
this.isCheckboxSelectionInvalid = true;
this.inputBox.disable();
} else {
this.isCheckboxSelectionInvalid = false;
this.inputBox.enable();
}

这适用于所有默认情况 - 但存在问题。当我调用 resetForm()(前提是通过选中其中一个复选框启用了输入)时,它基本上调用了与 initForm() 相同的方法,输入保持启用状态。即使在我调用验证复选框选择并禁用 initForm() 方法中的输入的方法之后也是如此。

为了理智,我记录了输入的 disabled 属性的值 - 它记录了 true

为什么输入没有被禁用呢?任何帮助将不胜感激,这是工作中的一个问题。

最佳答案

您遇到的问题与 Angular 错误有关,您可以找到更多信息 here .

有一些对我有用的解决方法:

  1. 在 setTimeout 中调用禁用函数。
validateCheckboxSelectionAndChangeInputState() {
if (!this.cb1.value && !this.cb2.value) {
this.isCheckboxSelectionInvalid = true;
setTimeout(() => {
this.inputBox.disable();
}, 0);
} else {
this.isCheckboxSelectionInvalid = false;
this.inputBox.enable();
}
}
  1. 直接设置disabled属性:
<input type="text" [attr.disabled]="form.controls['inputBox'].disabled" formControlName="inputBox" />
  1. 在调用启用/禁用函数之前调用 detectChanges。
validateCheckboxSelectionAndChangeInputState() {
this.ref.detectChanges();
if (!this.cb1.value && !this.cb2.value) {
this.isCheckboxSelectionInvalid = true;
this.inputBox.disable();
} else {
this.isCheckboxSelectionInvalid = false;
this.inputBox.enable();
}
}


与问题无关的建议:


有了启用或禁用控件的想法,可以订阅表格valueChanges :

  initForm() {
this.form = this.formService.getForm();
this.cb1 = this.form.get("cb1");
this.cb2 = this.form.get("cb2");
this.inputBox = this.form.get("inputBox");
this.form.valueChanges.subscribe(
this.validateCheckboxSelectionAndChangeInputState.bind(this)
);
}

validateCheckboxSelectionAndChangeInputState(controls) {
if (this.inputBox.disabled && controls.cb1 && controls.cb2) {
this.inputBox.enable();
}
if(this.inputBox.enabled && !controls.cb1 && !controls.cb) {
setTimeout(() => {
this.inputBox.disable();
}, 0);
}
}

toggleCb1() {
this.cb1.setValue(!this.cb1.value);
}

toggleCb2() {
this.cb2.setValue(!this.cb2.value);
}

resetForm() {
this.initForm();
}

您还可以使用 form.valid 和 Validators.requiredTrue [禁用] 按钮:

html

 <button [disabled]="!form.valid" (click)="submitForm()">
Submit
</button>

public getForm() {
return this.fb.group({
cb1: this.fb.control(false, [Validators.requiredTrue]),
cb2: this.fb.control(false, [Validators.requiredTrue]),
inputBox: this.fb.control(
{ value: "", disabled: true },
[Validators.required]
)
});
}

参见 https://stackblitz.com/edit/angular-6-reactive-form-disable-jn4cf8?file=src%2Fapp%2Fapp.component.ts

关于angular - 在 Angular 6 中重置响应式表单时不会禁用输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64643886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com