Angular 角度反应形式的高效自定义输入组件

Angular 角度反应形式的高效自定义输入组件,angular,reactive-forms,angular-changedetection,Angular,Reactive Forms,Angular Changedetection,在我们的angular应用程序中,我们希望每个表单有大量的输入字段。我们已经实现了自定义输入组件,每个组件负责处理一个输入字段,并使用反应式表单显示相应的错误消息。 虽然我们知道将表单组划分为更小的组和数组的可能性,但我们希望对表单的最小部分有一个有效的解决方案。 我想问,与下面演示的解决方案相比,是否有更好的方法(如渲染时间和更少不必要的更改检测)来实现我们的目标。 当前解决方案: 自定义输入组件有一个@input字符串,指定formControlName,以便在通过viewProvider使

在我们的angular应用程序中,我们希望每个表单有大量的输入字段。我们已经实现了自定义输入组件,每个组件负责处理一个输入字段,并使用反应式表单显示相应的错误消息。
虽然我们知道将表单组划分为更小的组和数组的可能性,但我们希望对表单的最小部分有一个有效的解决方案。 我想问,与下面演示的解决方案相比,是否有更好的方法(如渲染时间和更少不必要的更改检测)来实现我们的目标。
当前解决方案:
自定义输入组件有一个@input字符串,指定formControlName,以便在通过viewProvider使用现有FormGroupDirective的帮助下将表单控件绑定到输入。 在自定义组件中,我们还有“@ViewChild(FormControlName)control”,它绑定到FormControl,并在必要时用于检查有效性和错误输出。
最简单的例子是:
parent.component.ts:

exampleForm = this.formBuilder.group({
    exampleControl1: [null,Validators.required],
    exampleControl2: [null,Validators.required]});
@Component({
  selector: 'app-inputtype1',
  templateUrl: './inputtype1.component.html',
  styleUrls: ['./inputtype1.component.scss'],
  viewProviders: [{provide: ControlContainer, useExisting: FormGroupDirective}]
})

export class Inputtype1Component implements OnInit, AfterViewInit {

  @Input() stamp = '';
  // @ts-ignore
  @ViewChild(FormControlName) control;

  constructor(public fgd: FormGroupDirective, private cdr: ChangeDetectorRef) {
  }

  ngOnInit() {
  }

  ngAfterViewInit() {
    this.cdr.detectChanges();
  }

}
parent.component.html:

<form [formGroup]="patientForm">
<app-inputtype1-component>Label-String 1</app-inputtype1-component>
<app-inputtype2-component>Label-Stirng 2</app-inputtype2-component>
</form>
<label class="label">
  <ng-content></ng-content>
</label>
<input type="text" id="{{stamp}}" class="input" formControlName="{{stamp}}"/>
<app-errors *ngIf="control?.invalid" [errors]="control.errors"></app-errors>
inputtype1.component.html:

<form [formGroup]="patientForm">
<app-inputtype1-component>Label-String 1</app-inputtype1-component>
<app-inputtype2-component>Label-Stirng 2</app-inputtype2-component>
</form>
<label class="label">
  <ng-content></ng-content>
</label>
<input type="text" id="{{stamp}}" class="input" formControlName="{{stamp}}"/>
<app-errors *ngIf="control?.invalid" [errors]="control.errors"></app-errors>


提前感谢您的任何意见

您尝试过ControlValueAccessor吗?@MoufeedJuboqji我已经研究过ControlValueAccessor,虽然我认为它提供了一个更好地优化某些方面的机会(并且有可能注入ngcontrol),但使用它将需要我们重新实现IDE中已经存在的功能。我们的大多数自定义输入组件只是一个本地元素,被包装在其他布局和错误标记中。我们仍然需要重写CheckboxControlValueAccessor和其他具有基本相同功能的控件,或者有没有办法重用现有的ValueAccessor?