Angular 2:包含子组件的表单

时间:2016-10-21 08:52:00

标签: angular angular2-forms

我的组件在表单中有一个表单和一些子组件。使用*ngFor创建子组件,每个子组件包含input个元素。 Angular2编译器给出的错误如[formGroup]未定义。

此实施是否正确?

父组件:

<section class="data-body">
        <form [formGroup]="checkoutForm" novalidate>
            <app-checkout-product-view *ngFor="let item of checkoutData.products" [_product]="item" formGroupName="products"></app-checkout-product-view>
                <div class="col-md-4">
                    <label>Nominee:</label>
                    <select required [(ngModel)]="checkoutData.selectedNominee" [ngModelOptions]="{standalone: true}">
                        <option *ngFor="let nominee of checkoutData.nomineeList" [value]="nominee">{{nominee}}</option>
                    </select>
                </div>
                <div class="col-md-4">
                    <label>Bank Account:</label>
                    <select [(ngModel)]="checkoutData.selectedBank" required [ngModelOptions]="{standalone: true}">
                        <option *ngFor="let bank of checkoutData.bankList" [value]="bank">{{bank}}</option>
                    </select>
                </div>
            </div>
        </form>
    </section>

子组件:app-checkout-product-view

<div class="row">
    <div class="col-md-4">
        <md-input required [(ngModel)]="product.investmentAmount 
                  formControlName="investmentAmount">
            <span md-prefix>&#x20B9;</span><!--Rupee icon-->
        </md-input>
    </div>
</div>

P.S。 :所有导入都很好,所以我很确定这里没有导入错误

2 个答案:

答案 0 :(得分:53)

此行为是预期的。嵌套组件内部不会自动注册角形表单。但是,您可以通过将外部FormGroup提供给子组件来解决此问题。在子组件内部将模板包装在同一组内。以下是这可能的样子:

/外部组件代码 - 它包含表单/

@Component({
  selector: 'my-app',
  template: `
    <form [formGroup]="reactiveFormGroup">
      <input formControlName="foo" />
      <my-comp **[group]="reactiveFormGroup"**></my-comp>
    </form>

    form value: {{ reactiveFormGroup.value | json }}
  `
})
export class AppComponent { 
  reactiveFormGroup = new FormGroup({
    foo: new FormControl('default foo'),
    bar: new FormControl('default bar')
  });
}

/子组件代码,即my-comp /

@Component({
  selector: 'my-comp',
  template: `
    <div [formGroup]="group">
      <input   [formControlName]="'bar'" />
    </div>
  `
})
export class MyComponent { 
  @Input() group: FormGroup;
}

答案 1 :(得分:2)

你说进口是好的,但你得到的错误表明它们可能不是。

[formGroup] is not defined错误通常是由于失踪而引起的 import { ReactiveFormsModule } from '@angular/forms'在声明组件的模块中。

除此之外,您不应在模型驱动的表单中使用[(ngModel)],而应依赖[formGroup]formControlName