Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2: Form containing child component

I have component which has a form and some child components within the form. The child components are created using *ngFor and each child contains input elements. Angular2 compiler is giving errors like [formGroup] is not defined.

Is this implementation a correct?

Parent Component:

<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> 

Child Component: 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. : All the imports are fine so I am pretty sure that no import errors here

like image 358
Sumit Agarwal Avatar asked Oct 21 '16 08:10

Sumit Agarwal


People also ask

What is @input and @output in Angular?

Both are used to transform the data from one component to another component. Or, you can say pass the different types of data from parent to child component and child to parent component. Or, in a simple way transform/exchange data between two-component.

How does @input work in Angular?

Use the @Input() decorator in a child component or directive to let Angular know that a property in that component can receive its value from its parent component. It helps to remember that the data flow is from the perspective of the child component.


1 Answers

This behavior is expected. Angular forms are not automatically registered when inside nested component. However you can workaround this by providing the outer FormGroup to the child component. And inside the child component wrap the template inside that same group. Here is how this might look:

/outer component code - it contains the form/

@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')   }); } 

/child component code, i.e my-comp/

@Component({   selector: 'my-comp',   template: `     <div [formGroup]="group">       <input   [formControlName]="'bar'" />     </div>   ` }) export class MyComponent {    @Input() group: FormGroup; } 
like image 92
rusev Avatar answered Oct 14 '22 23:10

rusev