{"componentChunkName":"component---src-templates-tags-js","path":"/tags/formgroup/","result":{"data":{"allMarkdownRemark":{"totalCount":1,"edges":[{"node":{"id":"7e6b2e91-fd91-5e9b-8655-7e4f2dd84053","html":"<p>It’s been a while since I decided to write about reactive forms, as I believe they are an essential part of every developer’s life.</p>\n<!--more-->\n<p>Before I start, let’s see what does reactive mean.</p>\n<p>When talking about <a href=\"https://angular.io/guide/reactive-forms\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">reactive forms</a>, it means that we are avoiding to use <code class=\"language-text\">ngModel</code>, <code class=\"language-text\">required</code> and so on. This means that instead of showing that Angular is taking care of the form for us, we can use the underlying APIs to do so.</p>\n<p><a href=\"https://github.com/yashints/NestedFormGroupsAngular\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Full source code here</a>.</p>\n<p>In a simpler term, instead of using template driven model binding, we can construct our own form and the way they should be bound, validated and so on. For more information please refer to <a href=\"https://angular.io/guide/reactive-forms\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Angular documentation here</a>.</p>\n<p>Now if you are creating a form in <a href=\"https://angular.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Angular </a> using Reactive Forms and you have a complex object to bind to i.e. your form has multiple sections and each of them should be bound to a child object, then you can simply use <a href=\"https://angular.io/api/forms/FormControl#formcontrol\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">FormControl</a> on an input like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"13612324312323887000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`<input formControlName=&quot;”parent.child.property”&quot; />`, `13612324312323887000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">formControlName</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>”parent.child.property”<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Instead you can use nested form groups that make it easy to understand and prevent you from having a large flat object to use in your bindings. So let’s see how we should do it properly.</p>\n<p>Let’s assume we have a form to let user select some services they want to purchase as part of a package. Each service is presented in UI as a checkbox which user can check or uncheck.</p>\n<div class=\"custom-block info\"><div class=\"custom-block-body\"><strong>Note:</strong> Assumptions I’ve made: You are familiar with Angular and also had some basic exposure to Reactive Forms.</div></div>\n<p>Our model would look something like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"25377204085972906000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`export class Package {\r\n  name: string\r\n  serviceInfo: ServiceInfo\r\n}\r\n\r\nexport class ServiceInfo {\r\n  deliveryDate: Date\r\n  services: Array<string>\r\n}`, `25377204085972906000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Package</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> string\r\n  <span class=\"token literal-property property\">serviceInfo</span><span class=\"token operator\">:</span> ServiceInfo\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ServiceInfo</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">deliveryDate</span><span class=\"token operator\">:</span> Date\r\n  <span class=\"token literal-property property\">services</span><span class=\"token operator\">:</span> Array<span class=\"token operator\">&lt;</span>string<span class=\"token operator\">></span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And we can then create the form group using the <code class=\"language-text\">FormBuilder</code> which we can inject into our constructor:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"55262946306700320000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`export class MyForm {\r\n  packageForm: FormGroup;\r\n\r\n  constructor(private fb: FormBuilder) {\r\n\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.packageForm = this.fb.group({\r\n      name: ['', Validators.required],\r\n      serviceInfo: this.fb.group({\r\n        deliveryDate: '',\r\n        services: this.fb.FormArray()\r\n      })\r\n    });\r\n  }\r\n}`, `55262946306700320000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">MyForm</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">packageForm</span><span class=\"token operator\">:</span> FormGroup<span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">fb</span><span class=\"token operator\">:</span> FormBuilder</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">ngOnInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>packageForm <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">group</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n      <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">''</span><span class=\"token punctuation\">,</span> Validators<span class=\"token punctuation\">.</span>required<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token literal-property property\">serviceInfo</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">group</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n        <span class=\"token literal-property property\">deliveryDate</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\r\n        <span class=\"token literal-property property\">services</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">FormArray</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>For now I just used an array but we will change this shortly after we created our service catalogue object:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"87888421744130490000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`serviceList: Array<any> = [\r\n  { name: 'ADSL', code: 'ADSL', selected: false },\r\n  { name: 'Cable Broad Band', code: 'CBL', selected: false },\r\n  { name: 'Foxtel TV', code: 'FOXTEL', selected: true },\r\n  { name: 'Home Wireless', code: 'HWL', selected: true },\r\n  { name: '4G Network', code: '4G', selected: false }\r\n];`, `87888421744130490000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token literal-property property\">serviceList</span><span class=\"token operator\">:</span> Array<span class=\"token operator\">&lt;</span>any<span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'ADSL'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">code</span><span class=\"token operator\">:</span> <span class=\"token string\">'ADSL'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">selected</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Cable Broad Band'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">code</span><span class=\"token operator\">:</span> <span class=\"token string\">'CBL'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">selected</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Foxtel TV'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">code</span><span class=\"token operator\">:</span> <span class=\"token string\">'FOXTEL'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">selected</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Home Wireless'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">code</span><span class=\"token operator\">:</span> <span class=\"token string\">'HWL'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">selected</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'4G Network'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">code</span><span class=\"token operator\">:</span> <span class=\"token string\">'4G'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">selected</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now we can create a method which will generate the desired <code class=\"language-text\">FormArray</code> for us (just to keep the form group creation clean) using the above catalogue:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60118162090781310000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`buildServiceList() {\r\n  const arr = this.serviceList.map(service => {\r\n    return this.fb.control(service.selected);\r\n  });\r\n  return this.fb.array(arr);\r\n}`, `60118162090781310000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token function\">buildServiceList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> arr <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>serviceList<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">service</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">control</span><span class=\"token punctuation\">(</span>service<span class=\"token punctuation\">.</span>selected<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">array</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>This method will simply create a <code class=\"language-text\">FormArray</code> and adds <code class=\"language-text\">Boolean</code> controls to it where the service’s selected property is <code class=\"language-text\">true</code>. We can now use this method to generate our <code class=\"language-text\">FormGroup</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"67577276653681430000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`ngOnInit(): void {\r\n  this.packageForm = this.fb.group({\r\n    name: ['', Validators.required],\r\n    serviceInfo: this.fb.group({\r\n      deliveryDate: '',\r\n      services: this.buildServiceList()\r\n    })\r\n\r\n  });\r\n}`, `67577276653681430000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token function\">ngOnInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>packageForm <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">group</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">''</span><span class=\"token punctuation\">,</span> Validators<span class=\"token punctuation\">.</span>required<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">serviceInfo</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fb<span class=\"token punctuation\">.</span><span class=\"token function\">group</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n      <span class=\"token literal-property property\">deliveryDate</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token literal-property property\">services</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">buildServiceList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>So far we have defined our <code class=\"language-text\">FormGroup</code> and we can now use it in our HTML template.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"81245910883662770000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`<div class=&quot;container&quot;>\r\n  <h1>Select your services</h1>\r\n  <form [formGroup]=&quot;packageForm&quot; (submit)=&quot;onSubmit()&quot;>\r\n    <div class=&quot;form-group&quot;>\r\n      <label for=&quot;name&quot;>Your name:</label>\r\n      <input name=&quot;name&quot; formControlName=&quot;name&quot; />\r\n    </div>\r\n    <div formGroupName=&quot;serviceInfo&quot;>\r\n      <div class=&quot;form-group&quot;>\r\n        <label>Delivery Date:</label>\r\n        <input formControlName=&quot;deliveryDate&quot; type=&quot;date&quot; />\r\n      </div>\r\n      <div class=&quot;form-group&quot;>\r\n        <label>Services:</label>\r\n        <div *ngFor=&quot;let service of services.controls; let i = index&quot;>\r\n          <label>\r\n            <input type=&quot;checkbox&quot; [formControl]=&quot;service&quot; value=&quot;&quot; />\r\n          </label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div><button class=&quot;btn btn-primary&quot;>Save</button></div>\r\n  </form>\r\n</div>`, `81245910883662770000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span>Select your services<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">[formGroup]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>packageForm<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">(submit)</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>onSubmit()<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>form-group<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">for</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>name<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Your name:<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>name<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">formControlName</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>name<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">formGroupName</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>serviceInfo<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>form-group<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span><span class=\"token punctuation\">></span></span>Delivery Date:<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">formControlName</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>deliveryDate<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>date<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>form-group<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span><span class=\"token punctuation\">></span></span>Services:<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">*ngFor</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>let service of services.controls; let i = index<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span><span class=\"token punctuation\">></span></span>\r\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>checkbox<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">[formControl]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>service<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">value</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\r\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>btn btn-primary<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Save<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span>\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>In this template, I’ve used a form which has <code class=\"language-text\">[formGroup]</code> to use our <code class=\"language-text\">packageForm</code>. Then I’ve defined a form control for the name property.</p>\n<p>Once that is done it is now time to go ahead and create the template for the child <code class=\"language-text\">FormGroup</code>.  As you can see we need a container element (I’ve used <code class=\"language-text\">div</code> in this case but you can use <code class=\"language-text\">ng-container</code> if you don’t want any element on DOM for that). We tell Angular that this part should be assigned to a <code class=\"language-text\">FormGroup</code> named “serviceInfo”.</p>\n<p>Now we define our delivery date as normal formControl and when it comes to services we can then loop through the services array and generate them. There are two ways to access the array. As you can see in the above template I’ve stored the array in a class property and then used it to keep my template more readable.</p>\n<p>However you can access it like this using the packageForm:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"77118261457900860000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`<!--Line break for readability-->\r\n<div\r\n  *ngFor=&quot;let service of packageForm.controls.serviceInfo.controls.services.controls; \r\n  let i = index&quot;\r\n></div>`, `77118261457900860000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token comment\">&lt;!--Line break for readability--></span>\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span>\r\n  <span class=\"token attr-name\">*ngFor</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>let service of packageForm.controls.serviceInfo.controls.services.controls; \r\n  let i = index<span class=\"token punctuation\">\"</span></span>\r\n<span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>You can see why I’ve stored it in a local variable now. Now when you make changes to the form, you can see it below when I am just outputting the value of the form.</p>\n<p>Alright we just need to extract the selected services when the form is submitted. I’ve created another method to do so:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"72522362471713554000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`getSelectedServices() {\r\n  return this.packageForm.value\r\n    .services.filter(x => x)\r\n              .map((selected, i) => this.serviceList.map( service => service.code ));\r\n}`, `72522362471713554000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token function\">getSelectedServices</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>packageForm<span class=\"token punctuation\">.</span>value\r\n    <span class=\"token punctuation\">.</span>services<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> x<span class=\"token punctuation\">)</span>\r\n              <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">selected<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>serviceList<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span> <span class=\"token parameter\">service</span> <span class=\"token operator\">=></span> service<span class=\"token punctuation\">.</span>code <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>You can then call this on submit to extract the services and save it as an <code class=\"language-text\">Array&lt;string></code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"52501415956627940000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`onSubmit() {\r\n    const formValue = Object.assign({}, this.packageForm.value, {\r\n      selectedServices:  this.getSelectedServices()\r\n    });\r\n    console.log(formValue);\r\n}`, `52501415956627940000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token function\">onSubmit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">const</span> formValue <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>packageForm<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token literal-property property\">selectedServices</span><span class=\"token operator\">:</span>  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getSelectedServices</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>formValue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And that’s it. Hope this helps people like me who are looking to use complex objects in their UI forms and want to use <code class=\"language-text\">Reactive Forms</code> as their desired method.</p>\n<p>And as always don’t forget to spread the love by sharing this if it was useful, and also feedback always is welcomed.</p>","timeToRead":4,"frontmatter":{"title":"How to use nested form groups using ReactiveForms in Angular","unformattedDate":"2017-12-15T00:00:00.000Z","date":"Dec 15, 2017","path":"nested-formgroups-reactiveforms-angular/","author":"Yaser Adel Mehraban","tags":["angular","formarray","formcontrol","formgroup","reactiveforms"],"thumbnail":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAATABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAEDAgT/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAgME/9oADAMBAAIQAxAAAAHw6zvpwwFwoQH/xAAZEAADAAMAAAAAAAAAAAAAAAAAAQIgITH/2gAIAQEAAQUCLUpk83j/AP/EABcRAQADAAAAAAAAAAAAAAAAAAERICL/2gAIAQMBAT8BHMU//8QAFxEBAAMAAAAAAAAAAAAAAAAAAREgIf/aAAgBAgEBPwFNmn//xAAaEAACAgMAAAAAAAAAAAAAAAAAARARICIy/9oACAEBAAY/AjWKpM4WP//EABsQAQACAwEBAAAAAAAAAAAAAAEAERAhUTFx/9oACAEBAAE/IT3cIWsw1XU3H4otq1WLeuP/2gAMAwEAAgADAAAAELzogv/EABgRAQADAQAAAAAAAAAAAAAAAAERIDFB/9oACAEDAQE/EDFHe0//xAAXEQEAAwAAAAAAAAAAAAAAAAABESAx/9oACAECAQE/EETLKf/EAB8QAQABAwQDAAAAAAAAAAAAAAERACExEEFRcYHB8f/aAAgBAQABPxCKTCb0QW6/e/hzoAYvZsUAKllHHuiEAWYMFCjIp1X0NP/Z"},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/dbe96d76e01914cb3d535d67c3dab3e2/85e4b/ReactiveForms.jpg","srcSet":"/static/dbe96d76e01914cb3d535d67c3dab3e2/85e4b/ReactiveForms.jpg 470w","sizes":"(min-width: 470px) 470px, 100vw"},"sources":[{"srcSet":"/static/dbe96d76e01914cb3d535d67c3dab3e2/091f0/ReactiveForms.webp 470w","type":"image/webp","sizes":"(min-width: 470px) 470px, 100vw"}]},"width":470,"height":440}}}}}}]}},"pageContext":{"tag":"formgroup"}},"staticQueryHashes":[],"slicesMap":{}}