Cześć,
Chciałem prosić o drobną pomoc w zrozumieniu a przy okazji ocenę sposobu w jaki tworzę formularze w Angularze. Przykład dotyczy zwykłego logowania (login + hasło).
Chcąc uprościć stylizacje i dodawanie kolejnych pól, wydzieliłem cały input do osobnego komponentu. Na początek utworzyłem interfejs, który zawiera wszystkie własności jakie chcę dodać do danego input'a:
export interface InputTemplate {
id: string,
label: string,
name: string,
placeholder? : string,
type: string
}
Później w pliku html, po utworzeniu obiektu, binduję te wartości do danego input'a
<input
type="{{inputElement.type}}"
name="{{inputElement.name}}"
id="{{inputElement.id}}"
placeholder="{{inputElement.placeholder}}"
[(ngModel)]="inputValue"
/>
Następnie w komponencie z formularzem do logowania dodaję kolejne input'y (na podstawie relacji parent-child) poprzez utworzenie tablicy inputów:
readonly inputs: InputTemplate[] = [{
id: "login-username",
label: "Nazwa użytkownika",
name: "username",
placeholder: "Podaj nazwę użytkownika",
type: "text"
},
{
id: "login-password",
label: "Hasło",
name: "password",
placeholder: "Podaj hasło",
type: "password"
}];
a następnie za pomocą ngFor generuję kolejne inputy w html:
<form #loginForm="ngForm" (ngSubmit)="loginUser()">
<app-input
*ngFor="let input of inputs"
[inputElement]="input"
(inputValueEmitter)="onNewInput($event, input)"
></app-input>
<app-user-button [buttonElement]="loginButton"></app-user-button>
</form>
Wartości z kolejnych input'ów przypisuję do odpowiedniego pola obiektu (w komponencie z formularzem) za pomocą EventEmittera. Generalnie ta metoda jest dla mnie całkiem wygodna, ale mam tutaj wątpliwości. Przez wszystkim chodzi o:
#loginForm="ngForm"
Generalnie w różnych poradnikach jest informacja, że jest to ważny element formularza w Angularze, jego obiekt udostępnia różne właściwości formularza jak i wartości z inputów, pod warunkiem ustawienia atrybutu name. Natomiast w moim przykładzie po kliknięciu submit w tym obiekcie nie są przekazywane żadne wartości z inputów także albo gdzieś po drodze popełniłem błąd albo nie mogę w ten sposób przekazywać wartości. Dlatego też zastanawiałem się nad wyrzuceniem ngFor i dodaniu kilku input komponentów bezpośrednio w HTML.
Z drugiej strony zastanawiam się czy ta referencja i atrybuty name są naprawdę potrzebne. Obecnie przy każdym wywołaniu EventEmitter'a aktualizuje swój obiekt, który przetrzymuje wartości z formularza (tutaj nie ma problemu) i ten obiekt mogę później wysłać (po walidacji) na serwer.
Czy moglibyście podpowiedzieć, które podejście będzie lepsze i czy są jakieś inne ważne powody, dla których powinienem użyć referencji #loginForm?