לפעמים יש לנו מצב של טופס שפרוס על פני כמה עמודים, צעדים של מילוי טופס. אנחנו רוצים את אותו הטופס לאורך כל התהליך. אפשר לעשות את זה עם form control.

הגדרת הטופס הראשי

בעמוד הראשי שמכיל את הניווט לשאר העמודים ואת ה-router-outlet נגדיר את הטופס.

קובץ span-form.component.ts

//parent component where form is initialized
export class SpanFormComponent implements OnInit {
  public mainForm: FormGroup;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.mainForm = this.fb.group({
      user_name: ['', Validators.required],
      first_name: ['',Validators.required],
      last_name: ['',Validators.required],
      email: ['',Validators.required],
      address: this.fb.group({
        street: ['',Validators.required],
        city: ['',Validators.required],
        state: ['',Validators.required],
        zip: ['',Validators.required]
      }),
      favorite_color: ['',Validators.required],
      favorite_food: ['',Validators.required],
      favorite_season: ['',Validators.required],
      favorite_episode: ['',Validators.required]
    })
  }
}

קובץ span-form.component.html

<button routerLink="step-1">Step 1</button>
<button routerLink="step-2">Step 2</button>
<button routerLink="step-3">Step 3</button>
<form [formGroup]="mainForm" class="form-ui">
      <router-outlet></router-outlet>
</form>

התבנית של העמוד מחזיקה את כפתורי הניווט ואת האיזור של הצגת השלבים השונים ע"י router-outlet. ה-router-outlet יושב התוך תגית של form עם formGroup של הטופס הראשי שהגדרנו. עכשיו לכל צעד אנחנו רוצים להגדיר את הטופס שלו.

הגדרת טפסי המשנה

בקומפוננטת הילד אנחנו מחברים את FormControl שמשתף את הטופס מקומפוננטת האב.

קובץ step1.component.ts

export class Step1Component implements OnInit {
  public parentForm;
  constructor(@Optional() private controlContainer: ControlContainer) {}

  ngOnInit() {
    this.parentForm = this.controlContainer.control;
  }
}

בתבנית עצמה זמינים לנו כל הפקדים של האב.

קובץ step1.component.html

<h3>Step One of Our Sign-in Process</h3>
<form [formGroup]="parentForm">
      <div class="form-group">
        <label for="name">Choose a User Name</label>
        <input name="user_name" formControlName="user_name" />
      </div>
</form>
<button [disabled]="!parentForm.controls.user_name.valid"
    routerLink="/signup/step-2">Next</button>