使用 Angular 组件作为表单控件

Using an Angular component as form control

考虑以下形式

   <div [formGroup]="form">

        <div [ngSwitch]="control.controlType">

            <div *ngSwitchCase="'checkbox'">
                <label [attr.for]="control.key">{{control.label}}</label>
                <input [formControlName]="control.key" [id]="control.key" type="checkbox"
                    (change)="evaluate(control.key)">
            </div>

            <app-multiple-checkbox [formControlName]="control.key"  *ngSwitchCase="'multipleCheckbox'"
                [options]="control.options" (change)="evaluate(control.key)">
            </app-multiple-checkbox>
        </div>

    </div>

我的表单是动态构建的。它由 checkboxesa 和自定义组件 multiple-checkbox 组成。使用简单的复选框一切正常,但使用自定义组件时出现以下错误:

Error: No value accessor for form control with name: 'content-type'

'content-type' 是 control.key 传递到我的自定义组件的 formControlName 属性的值。

@Component({
  selector: 'app-multiple-checkbox',
  templateUrl: './multiple-checkbox.component.html',
  styleUrls: ['./multiple-checkbox.component.scss']
})
export class MultipleCheckboxComponent implements OnInit {

  constructor() { }

  @Input() public options: { key, value }[];
  @Output() haschanged = new EventEmitter();


  ngOnInit(): void {
    console.log(this.options);
  }

  evaluate(key): void {
    this.haschanged.emit(key, this.options);
  }
}

我知道我在这里遗漏了一些使它成为表单组件的东西,但我不知道是什么。 特别是,此自定义表单控件的值应该是所选复选框的 ID。我该如何指定?

我不确定但是 我相信你应该定义和初始化 属性

控制:{controlType:whateverType, ...}

对于你的组件

您需要为您的组件提供 NG_VALUE_ACCESSOR DI 令牌:

@Component({
  selector: "hello",
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => HelloComponent),
      multi: true
    }
  ]
})

并实现ControlValueAccessor接口。然后 Angular 表单 API 会将您的组件视为功能表单控件。

HereHelloComopnent 的示例代码,它是一个自定义表单控件。