Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting Error: formGroup expects a FormGroup instance. Please pass one in

I am new to Angular 2 and unable to resolve this issue even after going through other stack overflow answers.

I have just now started learning angular reactive forms and want to try the first example but am stuck. Please help.

Here is the HTML form.

<div class="container">
  <div class="row">
    <div class="col-xs-12 col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
      <form [formGroup]="signupForm" (ngSubmit)="onSubmit()">
        <div id="user-data">
          <div class="form-group">
            <label for="username">Username</label>
            <input
              type="text"
              id="username"
              formControlName="username"
              class="form-control">
          </div>
          <div class="form-group">
            <label for="email">Email</label>
            <input
              type="email"
              id="email"
              formControlName="email"
              class="form-control">
          </div>
          <div class="radio" *ngFor="let gender of genders">
            <label>
              <input
                type="radio"
                class="form-control"
                formControlName="gender"
                [value]="gender">{{ gender }}
            </label>
          </div>
        </div>
        <button class="btn btn-primary" type="submit">Submit</button>
      </form>
    </div>
  </div>
</div>

And this is the TS file.

import { Component, OnInit } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit {

  genders = ['male', 'female'];
  // property to hold the form
  sigupForm: FormGroup;

  ngOnInit() {
    // initialize the form before rendering the template
    // hence 'OnInit' because this gets executed before the template is rendered// pass js object
    // {} tells this form doesn't has any 'controls'
    // 'controls' are key-value pairs to the overall form group

    this.sigupForm = new FormGroup({
      // form controls
      // arg1 - intial state/value of this control
      // arg2 - single validator or an array of validators
      // arg3 - async validators
      'username': new FormControl(null),
      'email': new FormControl(null),
      'gender': new FormControl('male')
    });
  }

  onSubmit() {
    console.log(this.sigupForm);
  }
}

In the output, I can see Username and Email Field but no Gender field.

Would you please help me out with fixing this?

I am sure it would be a minor change only but still, I am unable to figure out.

like image 613
Pranjal Successena Avatar asked Jan 02 '18 02:01

Pranjal Successena


People also ask

How do you initialize a FormGroup?

Using FormGroup Next, you need to create an instance of FormGroup with the instances of FormControl : productForm = new FormGroup({ reference: new FormControl(), quantity: new FormControl('11') }); You can provide a default value for the control, by passing it as an argument to the FormControl .

What is FormGroup in HTML?

HTML Attributes. The Form Tag Group is a group of tags that are used to create data input forms. Form group tags include <form>, <input>, <select>, <textarea>, <button>, and others.

How do I set value in FormGroup control?

To set only some values, use patchValue: this. myFormGroup. patchValue({ formControlName1: myValue1, // formControlName2: myValue2 (can be omitted) });

Can't bind to FormGroup since it isn't a known property of?

What Does This Error Mean? Angular is trying to tell us that it doesn't know about the formGroup directive on the <form> element in your component. This usually happens when the wrong forms module is imported, the right module is imported in the wrong place or the ReactiveFormsModule is just not imported at all.


1 Answers

In my case, I was using Reactive Forms and loading the data for form asynchronously from a service. But, the form template will start getting generated parallelly. And at that time form would be undefined as it would be built only after the data from API call was received. So, first, check if the form is initialized, then only start generating the template.

<form class="col-sm-12 form-content" *ngIf="form" [formGroup]="form">
like image 105
Prateek Kumar Dalbehera Avatar answered Oct 07 '22 16:10

Prateek Kumar Dalbehera