在ValueChanges
訂閱的表單控件將導致此錯誤Maximum call stack size exceeded
,所以最好使用其事件控制輸入中的更改(例如,鍵入)。
並且在設置新的驗證器應用它們之後不要忘記使用updateValueAndValidity
。
這是您的組件的新代碼,它的工作原理現在好:)
//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
@Component({
selector: 'my-app',
template: `
<div>
<form [formGroup]="userForm">
<section>
<div>
<label>username</label>
<input (keyup)="inputValueChanged($event)" formControlName="username" type="text">
</div>
<button [disabled]="disableSaveButton()">Save</button>
</section>
</form>
</div>
`,
})
export class App implements OnInit {
userForm: formGroup
constructor(private formBuilder: FormBuilder) {
}
disableSaveButton(): boolean {
console.log("is valid:", this.userForm.controls["username"].valid);
return this.userForm.controls["username"].invalid
}
ngOnInit(): void {
this.userForm = this.formBuilder.group({
username: '',
});
}
inputValueChanged(event){
let value = this.userForm.controls["username"].value;
if (value.length > 0) {
console.log("should be invalid if < 4")
this.userForm.controls["username"].setValidators([Validators.required, Validators.minLength(4)]);
} else {
console.log("should be valid")
this.userForm.controls["username"].setValidators([]);
}
this.userForm.controls["username"].updateValueAndValidity();
}
}
@NgModule({
imports: [ BrowserModule, FormsModule, ReactiveFormsModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
希望它有助於ü:)
謝謝你,我用'updateValueAndValidity'試了一下,但正如你所提到的,得到了'最大調用堆棧大小超過錯誤'。但按照預定的方式進行。 – RagnarLothbrok