Using Form Data in Angular Template-driven forms

app.component.html

<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 (ngSubmit)="onSubmit()" #myForm="ngForm">
        <div id="user-data"
             ngModelGroup="myUserData"
             #myUserData="ngModelGroup">
          <div class="form-group">
            <label for="username">Username</label>
            <input type="text" id="username" class="form-control"
                   ngModel name="username"
                   required>
          </div>
          <button class="btn btn-default" type="button"
                  (click)="suggestUserName()">Set All Values
          </button>

          <button class="btn btn-default" type="button"
                  (click)="overrideUseName()">Override Part of Values
          </button>
          <div class="form-group">
            <label for="email">Mail</label>
            <input type="email" id="email" class="form-control"
                   ngModel name="email"
                   required email
                   #myEmail="ngModel">
            <span class="help-block" *ngIf="!myEmail.valid && myEmail.touched">Please enter a valid email!</span>
          </div>
        </div>
        <p *ngIf="!myUserData.valid && myUserData.touched">User Data is invalid!</p>
        <div class="form-group">
          <label for="secret">Secret Questions</label>
          <select id="secret" class="form-control"
                  [ngModel]="'pet'"
                  name="secret">
            <option value="pet">Your first Pet?</option>
            <option value="teacher">Your first teacher?</option>
          </select>
          <div class="form-group">
            <textarea name="questionAnswer" rows="3" class="form-control"
                      [(ngModel)]="answer"></textarea>
          </div>
        </div>
        <div>Your replay: {{answer}}</div>
        <div class="radio" *ngFor="let gender of genders">
          <label>
            <input type="radio" required name="gender" ngModel [value]="gender">
            {{gender}}
          </label>
        </div>
        <button class="btn btn-primary" type="submit"
                [disabled]="!myForm.valid">Submit
        </button>
      </form>
    </div>
  </div>
  <hr/>
  <div class="row" *ngIf="submitted">
    <div class="col-xs-12">
      <h3>Your Data</h3>
      <p>Username: {{user.username}}</p>
      <p>Mail: {{user.email}}</p>
      <p>Secret Question: {{user.question}}</p>
      <p>Answer: {{user.answer}}</p>
      <p>Gender: {{user.gender}}</p>
    </div>
  </div>
</div>

app.component.ts

import {Component, ViewChild} from '@angular/core';
import {NgForm} from '@angular/forms';

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

  @ViewChild('myForm') signupForm: NgForm;
  answer: string;
  genders = ['male', 'female'];
  user = {
    username: '',
    email: '',
    question: '',
    answer: '',
    gender: ''
  };
  submitted = false;

  /**
   * Set values all together
   */
  suggestUserName() {
    const suggestedName = 'Superuser';
    this.signupForm.setValue({
      myUserData: {
        username: suggestedName,
        email: '[email protected]'
      },
      secret: 'pet',
      questionAnswer: 'Hello Wolrd',
      gender: 'male'
    });
  }

  /**
   * Set part of values
   */
  overrideUseName() {
    const suggestedName = 'Superuser';
    this.signupForm.form.patchValue({
      myUserData: {
        username: suggestedName
      }
    });
  }


  onSubmit() {
    this.user.username = this.signupForm.value.myUserData.username;
    this.user.email = this.signupForm.value.myUserData.email;
    this.user.question = this.signupForm.value.secret;
    this.user.answer = this.signupForm.value.questionAnswer;
    this.user.gender = this.signupForm.value.gender;
    this.submitted = true;
  }
}