Angular: Jak wypełnić formularz danymi?

Opublikowano: 25.06.2022 - tagi: JavaScript Angular Formularz Dane

W Angularze wypełnienie formularza danymi jest bardzo proste. W tym wpisie pokażę dwa sposoby, jak można to zrobić.

Model danych

Posłużę się tym samym modelem danych opisanym we wpisie: Angular: Jak stworzyć zagnieżdżony formularz?.

Mam taki model:

{
  name: "Foo",
  description: "Lorem ipsum...",
  attributes: {
    width: 100,
    height: 50,
    weight: 25
  }
}

Tworzymy model:

interface ProductAttributes {
  width: number;
  height: number;
  weight: number;
}

interface Product {
  name: string;
  description: string;
  attributes: ProductAttributes
}

Formularz

Tworzymy taki formularz:

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

@Component({
  selector: 'product-form',
  templateUrl: './product-form.component.html',
  styleUrls: ['./product-form.component.css']
})
export class ProductFormComponent {
  form = new FormGroup({
    name: new FormControl(''),
    description: new FormControl(''),
    attributes: new FormGroup({
      width: new FormControl(''),
      height: new FormControl(''),
      weight: new FormControl(''),
    })
  });
}

Mając już model i formularz, możemy wypełnić go danymi.

Sposób 1: Metoda setValue

Metoda setValue pochodzi z klasy FormGroup. Jedynym wymaganym parametrem tej metody jest obiekt, który odzwierciedla strukturę naszego formularza. Czyli obiekt musi składać się z takiej samej struktury jak model danych formularza. Jeśli spróbujemy przekazać coś innego: na przykład będzie brakować jakiegoś pola, to operacja się nie uda.

Poprawne wywołanie:

const data: Product = {
  name: "Foo",
  description: "Lorem ipsum...",
  attributes: {
    width: 100,
    height: 50,
    weight: 25
  }
};

this.form.setValue(data);

Wystąpi błąd:

const data: Product = {
  name: "Bar"
};

this.form.setValue(data); // błąd!

Sposób 2: Metoda patchValue

Ta metoda jest bardzo podobna do poprzedniej także pochodzi z FormGroup, ale jest pewna różnica. Można do niej przekazać obiekt, którego struktura nie jest identyczna jak model danych formularza. Na przykład jeśli przekażemy do wypełnienia tylko jedno pole, to operacja się uda.

Poprawne wywołanie:

const data: Product = {
  name: "Bar"
};

this.form.patchValue(data);

Możemy nawet przekazać jakieś nieistniejące pole:

const data: Product = {
  name: "Bar",
  price: 150
};

this.form.patchValue(data);