9

私は angular2 を初めて使用し、ここ数日間、モデル駆動型フォームを使用して再利用可能なフォーム コンポーネントを作成しようとしています。

コンポーネントがあるとしましょうcomponentA.component.ts

@Component({
    selector: 'common-a',
    template: `
    <div [formGroup]="_metadataIdentifier">
        <div class="form-group">
        <label>Common A[1]</label>
        <div>
            <input type="text" formControlName="valueA1">
            <small>Description 1</small>
        </div>
        <div class="form-group">
        <label>Common A[2]</label>
        <div>
            <input type="text" formControlName="valueA2">
            <small>Description 2</small>
        </div>
    </div>
    `
})


export class ComponentA implements OnInit{

    @Input('group')
    public myForm: FormGroup;

    constructor(private _fb: FormBuilder) {
    }

    ngOnInit() {
        this.myForm = this._fb.group({
            valueA1 : ['', [Validators.required]],
            valueA2 : ['', [Validators.required]],
        });
    }
}

そして成分BcomponentB.component.ts

@Component({
    selector: 'common-b',
    template: `
    <div [formGroup]="_metadataIdentifier">
        <div class="form-group">
        <label>Common B</label>
        <div>
            <input type="text" formControlName="valueB">
            <small>Description</small>
        </div>
    </div>
    `
})


export class ComponentB implements OnInit{

    @Input('group')
    public myForm: FormGroup;

    constructor(private _fb: FormBuilder) {
    }

    ngOnInit() {
        this.myForm= this._fb.group({
            valueB : ['', [Validators.required]]
        });
    }
}

私の質問は、入力のコントロールをメイン コンポーネントに移動せずに、この 2 つのサブ コンポーネントを使用してフォームを作成するにはどうすればよいかということです。たとえば、main.component.ts

@Component({
    selector: 'main',
    template: `
    <form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm.value)">
        <div>
            <common-a [group]="formA"></common-a>
            <common-b [group]="formB"></common-b>
            <div>
                <button>Register!</button>
            </div>
        </div>
    </form>
    `
})


export class Main implements OnInit{

    @Input('group')
    public myForm: FormGroup;

    public formA : FormGroup;

    public formB : FormGroup;

    constructor(private _fb: FormBuilder) {
    }

    ngOnInit() {
        this.myForm = this._fb.group({
            //how can I compose these two sub forms here
            //leaving the form control names agnostic to this component
        });
    }
}

このアイデアの背後にあるコンセプトは、構成要素の一部を共有する多くの複雑なフォームを構築することです。

Mainつまり、コンポーネントにformControlNames[ valueA1valueA2、 ] の名前を認識させたくありませんが、valueBそれらを自動的に挿入し、最上位のフォーム グループで更新/検証します。

正しい方向へのアイデアやポイントは役に立ちます。

4

1 に答える 1

10

これは、最上位レベルを子コンポーネントに渡し、上位レベルが下位レベルについて本質的に何も知る必要がない方法を使用しFormGroupて、子コンポーネントを上位レベルに追加することで実現できます。FormGroupformGroupNameFormGroup

main.component.ts

template: `<...>
    <common-a [parentForm]="myForm"></common-a>
    <...>

また、使用されなくなったため、formA、formB 宣言を削除します。

component-a.component.ts [formGroup]は親グループでformGroupNameあり、コンポーネントのコントロールをグループとして識別してアタッチし、より大きな全体で機能する方法です (親グループ内にネストされます)。

@Component({<...>
template: `
<div [formGroup]="parentForm">
    <div class="form-group">
    <label>Common A[1]</label>
    <div formGroupName="componentAForm">
        <input type="text" formControlName="valueA1">
        <small>Description 1</small>
    </div>
    <div class="form-group">
    <label>Common A[2]</label>
    <div formGroupName="componentAForm">
        <input type="text" formControlName="valueA2">
        <small>Description 2</small>
    </div>
</div>`
})

export class ComponentA implements OnInit {
     @Input() parentForm: FormGroup;
     componentAForm: FormGroup;

     constructor(private _fb: FormBuilder) {}

     ngOnInit() {
         this.componentAForm = this._fb.group({
             valueA1: ['', Validators.required],
             valueA2: ['', Validators.required]
         });

         this.parentForm.addControl("componentAForm", this.componentAForm);
     }
}

ここにプランカーがあります(実行できるかどうかを確認するために、ここでコンポーネント B をもう少し動的にしたことに注意してください。ただし、上記の実装は B にも同様に適用できます :プレビュー

于 2016-11-30T20:55:09.207 に答える