forms - Angular 2 中带有 FormArray 的 ControlValueAccessor

标签 forms angular

我有一个处理输入控件数组的子组件。我想对子组件进行表单控制。

我正在传递 json 对象数组,将父表单绑定(bind)到子组件的 FormArray 的正确方法是什么,该子组件具有 2 个表单控件,首先需要验证器。

这是初始代码

<h1>Child</h1>
<div formArrayName="names">
 <div *ngFor="let c of names.control">
  <input formControlName="firstName">
  <input formControlName="lastName">
 </div>
</div>

目的是将父表单与子组件中的输入控件数组绑定(bind)。如果子组件中的输入控件之一没有必填字段,表单也会变得无效。

http://plnkr.co/edit/HznCJfSEiSV28ERqNiWr?p=preview

最佳答案

我喜欢解决旧帖子 :)

关键是您的自定义表单组件在 FormArray 中,然后使用“writeValue”创建 formArray,参见 stackblitz

@Component({
    selector: "my-child",
    template: `
    <h1>Child</h1>

    <div *ngFor="let group of formArray.controls" [formGroup]="group">
        <input formControlName="firstName" (blur)="_onTouched()" />
        <input formControlName="lastName" (blur)="_onTouched()"/>
    </div>
    `,
    providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: Child,
            multi: true
        },
        {
            provide: NG_VALIDATORS,
            useExisting: Child,
            multi: true
        }
    ]
})
export class Child implements ControlValueAccessor {
    formArray: FormArray;
    _onChange;
    _onTouched;

    writeValue(value: any) {
        this.formArray = new FormArray(
            value.map(x => {
                return new FormGroup({
                    firstName: new FormControl(x.firstName, Validators.required),
                    lastName: new FormControl(x.firstName, Validators.required)
                });
            })
        );
        this.formArray.valueChanges.subscribe(res => {
            this._onChange(res);
        });
    }

    registerOnChange(fn: (value: any) => void) {
        this._onChange = fn;
    }

    registerOnTouched(fn: (value: any) => void) {
        this._onTouched = fn;
    }

    validate({ value }: FormControl) {
        return !this.formArray || this.formArray.valid ?
            null : { error: "Some fields are not fullfilled" };
    }
}

关于forms - Angular 2 中带有 FormArray 的 ControlValueAccessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439660/

相关文章:

pdf - 在使用 cfpdfform 操作之前检查 ColdFusion 中是否存在交互式表单 ="read"

ajax - Django - 基于验证的带有 "did you mean"提示的自定义小部件

php - 在 codeigniter 中提交表单后无法获取帖子值

javascript - 比较 HTML5 日期输入与 Angular2 日期

javascript - Angular 2 : Create route in the controller/component

ngFor 中的 Angular 动态 View 子级

angular - @Input 与 router.navigate angular4

javascript - 如何在 AngularJS 中以编程方式触发表单提交?

javascript - 合并两个 JavaScript 脚本

angular - (Angularfire) 使用 id 从 firebase 数据库中检索特定数据