Angular 表单:补丁值后无法在字段中键入

Angular Forms: after a patchValue unable to type in field

我有一个从数据中切换的表单-table。当我使用 patchValue 预填写表单时,我无法编辑该字段的内容。未填充 patchValue 的字段为 updatable.

这是控制器设置

@Input() signalMutate: Signal;

  signalForm: FormGroup;
  loading = false;
  submitted = false;
  error: string;
  formSignalValue: Signal;

  constructor(
    private formBuilder: FormBuilder,
    private router: Router,
    private authenticationService: AuthenticationService,
    private userService: UserService

  ) { }

  ngOnInit() {
    this.signalForm = this.formBuilder.group({
      title: [''],
      description: ['', Validators.required],
      problem: ['', Validators.required],
      value: ['', Validators.required],
      requestor: ['', Validators.required],
      label: ['']
  });


  }

  ngAfterContentChecked(){

    if(this.signalMutate) { 

        this.signalForm.patchValue(this.signalMutate);

    }

  }

知道为什么会这样吗?

谢谢!

因为您是在 afterContentChecked 挂钩中执行此操作,每个更改检测周期 运行 都会触发更改检测,并且每次输入输入时都会触发更改检测,因此您只需将值重置为任何 signalMutate 即可每次打字。

这样做:

private _signalMutate: Signal;
@Input() set signalMutate(signalMutate: Signal) {
  this._signalMutate = signalMutate
  this.signalForm.patchValue(signalMutate);
}
get signalMutate() {
  return this._signalMutate
}

setter输入运行当输入改变时。如果您希望更改反映在表单中,此设置还需要您确保您永远不会改变传入的信号对象。确保您始终创建一个新对象,例如:

this.signal = {...this.signal, ...newSignal }

像这样避免对象突变在任何情况下通常都被认为是好的做法,可以提高应用程序性能,并有助于避免难以发现的错误(像这样)