Search code examples
angularangular-reactive-formsangular2-formbuilder

Angular - Reactive Forms - How to pass an object to a FormGroup with a class and validators


I have a large form to create and decided to use the reactive form feature for ease of use. However, I am facing a few challenges that might be obvious and looking for help.

Below are two cases that yield the same outcome with the exception of the validation. The createFormWithValidation() method specifics every control and it's associated validators. The createFromPassingObject() method creates the same form using just the this.party object but without the added validators.

My goal is to pass an object to this.fb.group() that will have the controls that are part of the class and be able to specify validators for each property of the Party Class.

// The Class with the properties
export class Party {
  firstName: string = '';
  lastName: string = '';

  constructor() {}
}

// party Object
myForm: FormGroup;
this.party = new Party();

// Form with explicit controls and their validators

createFormWithValidation() {
  this.myForm = this.fb.group({
    firstName: [this.party.firstName, [Validators.required, Validators.minLength(3)]],
    lastName: [this.party.lastName, [Validators.required, Validators.minLength(3)]]
  })
}

// The goal is to achieve this type of method where this.party will be the object of the controls and their validators. 

createFormPassingObject() {
  this.myForm = this.fb.group(this.party)
}

Your help is greatly appreciated.


Solution

  • Here's what I am doing for my case. Be aware that I am in the midst of working on my project as well so there's no guarantee that it will work and it will work properly. Anyway, this is how I do it:

    // First is to define a const that is going to be the pre-defined object going in this.formBuilder.group()
    export const predefinedFormGroup = {
     property1: new FormControl('', Validators go here),
     property2: new FormControl('', Validators go here)
    }
    
    // Create the form
    this.myForm = this.formBuilder.group(predefinedFormGroup);
    
    // My use-case is I have to add new FormGroup to an existed FormGroup in an existed Form:
    (<FormGroup>this.myForm.get['sections']).addControl(section.name, this.formBuilder.group(section.interface));
    

    I hope I am making sense here.