Angular Reactive Forms Advanced

ஆங்குலர் ரியாக்டிவ் படிவங்கள் மேம்பட்டம் - சிக்கலான தரவு மாதிரியாக்கம் மற்றும் சரியான நேர சரிபார்ப்பு

ஆங்குலர் ரியாக்டிவ் படிவங்கள் மேம்பட்டம்

மேம்பட்ட ரியாக்டிவ் படிவங்கள் FormGroup/FormArray உடன் சிக்கலான தரவை மாதிரியாக்குகின்றன, ஒத்திசை/அசிங்க்ரோனஸ் சரிபார்ப்பாளர்களை இணைக்கின்றன மற்றும் patchValue மற்றும் updateOn உடன் திறம்பட புதுப்பிக்கின்றன; எதிர்வினை தர்க்கத்திற்கு valueChanges/statusChanges ஐக் கவனிக்கவும்.

ரியாக்டிவ் படிவங்கள் மேம்பட்ட அடிப்படைகள்

கட்டமைப்பு

சிக்கலான படிவங்களை மாதிரியாக்க FormGroup மற்றும் FormArray பயன்படுத்தவும்.

சரிபார்ப்பு

கட்டுப்பாடு மற்றும் குழு நிலைகளில் ஒத்திசை மற்றும் அசிங்க்ரோனஸ் சரிபார்ப்பாளர்களை இணைக்கவும்.

புதுப்பிப்புகள்

பகுதி புதுப்பிப்புகளுக்கு patchValue பயன்படுத்தவும்; setValue முழு வடிவத்தைக் கோருகிறது.

ரியாக்டிவ் படிவங்கள் மேம்பட்ட எடுத்துக்காட்டு

import { FormBuilder, Validators, FormArray } from '@angular/forms';

fb.group({
  name: ['', Validators.required],
  tags: fb.array([ fb.group({ label: ['Angular'] }) ])
});

// வரிசையைச் சேர்க்கவும்
(form.get('tags') as FormArray).push(fb.group({ label: [''] }));

எடுத்துக்காட்டு விளக்கம்:

  • fb.group({...}): கட்டுப்பாடுகள் மற்றும் சரிபார்ப்பாளர்களுடன் ஒரு FormGroup உருவாக்குகிறது.
  • FormArray: டைனமிக் வரிசைகளுக்கான கட்டுப்பாடுகள்/குழுக்களின் வரிசைப்படுத்தப்பட்ட பட்டியலை வைத்திருக்கிறது.
  • வரிசையைத் தள்ளவும்: (form.get('tags') as FormArray).push(fb.group({ label: [''] })) ஒரு புதிய குழுவைச் சேர்க்கிறது.

தொடர்புடையவை:

  • படிவங்கள் மற்றும் சேவைகள் & DI ஆகியவற்றைப் பார்க்கவும்.
  • வழிகளில் மீண்டும் பயன்படுத்துவதற்காக படிவ நிலையை ஒரு சேவையில் வைத்திருக்கவும்.
  • setValue vs patchValue: setValue முழு வடிவத்தைக் கோருகிறது; patchValue ஒரு துணைக்குழுவைப் புதுப்பிக்கிறது.
  • கட்டுப்பாடு மற்றும் குழு நிலைகளில் சரிபார்ப்பு செய்யவும்.

கூடிய குழுக்கள் மற்றும் வரிசைகள்

கட்டமைப்பு மற்றும் மறுபயன்பாட்டிற்காக தொடர்புடைய கட்டுப்பாடுகளைக் குழுவாக்கவும்.

டைனமிக் பட்டியல்களுக்கு FormArray பயன்படுத்தவும். FormArray என்பது கட்டுப்பாடுகளின் வரிசைப்படுத்தப்பட்ட பட்டியலாகும், அதன் நீளம் இயக்க நேரத்தில் மாறக்கூடியது.

FormArray எடுத்துக்காட்டு

const tags = fb.array([ fb.group({ label: ['Angular'] }) ]);
tags.push(fb.group({ label: [''] }));

முழுமையான எடுத்துக்காட்டு

import { bootstrapApplication } from '@angular/platform-browser';
import { Component } from '@angular/core';
import { ReactiveFormsModule, FormBuilder, Validators, FormArray } from '@angular/forms';
import { JsonPipe, CommonModule } from '@angular/common';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, ReactiveFormsModule, JsonPipe],
  template: `
    <h3>Advanced Reactive Form</h3>
    <form [formGroup]="form" (ngSubmit)="submit()">
      <input placeholder="Name" formControlName="name">
      <div formArrayName="tags">
        <div *ngFor="let t of tags.controls; let i = index" [formGroupName]="i">
          <input placeholder="Tag" formControlName="label">
        </div>
      </div>
      <button type="button" (click)="addTag()">Add Tag</button>
      <button type="submit">Submit</button>
    </form>
    <pre>{{ form.value | json }}</pre>
  `
})
class App {
  fb = new FormBuilder();
  form = this.fb.group({
    name: ['', Validators.required],
    tags: this.fb.array([this.fb.group({ label: ['Angular'] })])
  });
  get tags(): FormArray { return this.form.get('tags') as FormArray; }
  addTag() { this.tags.push(this.fb.group({ label: [''] })); }
  submit() { alert(JSON.stringify(this.form.value)); }
}

bootstrapApplication(App);

எடுத்துக்காட்டு விளக்கம்:

  • [formGroup]: படிவ மாதிரியை டெம்ப்ளேட்டுடன் இணைக்கிறது.
  • formArrayName: tags வரிசையைச் சுட்டிக்காட்டுகிறது; ஒவ்வொரு வரிசையும் [formGroupName]="i" பயன்படுத்துகிறது.
  • கெட்டர் + தள்ளுதல்: tags getter FormArray தருகிறது; addTag() ஒரு புதிய குழுவைத் தள்ளுகிறது.
  • சமர்ப்பிக்க: form.value ஐப் படிக்கிறது, இது கூடிய குழு/வரிசை கட்டமைப்பைப் பிரதிபலிக்கிறது.

பைண்டிங் உதவிக்குறிப்புகள்:

  • சீரான வடிவங்கள்: ஒரு FormArray க்கு ஒரே கட்டுப்பாட்டு வடிவத்துடன் குழுக்களைத் தள்ளவும்; பழமையானவற்றையும் குழுக்களையும் கலக்கத் தவிர்க்கவும்.
  • டைனமிக் பட்டியல்கள்: *ngFor உடன் வழங்கும்போது, வரிசைகளைச் சேர்க்க/நீக்கும்போது உள்ளீடுகளை நிலையானதாக வைத்திருக்க trackBy பயன்படுத்தவும்.

சரிபார்ப்பு மூலோபாயங்கள்

பெரும்பாலான விதிகளுக்கு ஒத்திசை சரிபார்ப்பாளர்களைப் பயன்படுத்தவும்; அவை விரைவானவை மற்றும் எளிமையானவை.

சேவையக சரிபார்ப்புகள்/தனிப்பட்ட தன்மைக்கு அசிங்க்ரோனஸ் சரிபார்ப்பாளர்களைப் பயன்படுத்தவும்; அவை ஒத்திசை சரிபார்ப்பாளர்களுக்குப் பிறகு இயங்கும்.

சரிபார்ப்பை இலகுவாக வைத்திருக்கவும் மற்றும் அசிங்க்ரோனஸ் சரிபார்ப்புகளுக்கு முன் உள்ளீடுகளை debounce செய்யவும்.

தனிப்பயன் சரிபார்ப்பாளர் எடுத்துக்காட்டு

import { AbstractControl, ValidationErrors } from '@angular/forms';

function banned(value: string[]): (c: AbstractControl) => ValidationErrors | null {
  return (c) => value.includes(c.value) ? { banned: true } : null;
}

fb.control('', [Validators.required, banned(['admin'])]);

எடுத்துக்காட்டு விளக்கம்:

  • சரிபார்ப்பாளர் தொழிற்சாலை: banned([...]) ஒரு செயல்பாட்டைத் தருகிறது (c: AbstractControl) => ValidationErrors | null.
  • கட்டுப்பாட்டு-நிலை: Validators.required போன்ற ஒத்திசை சரிபார்ப்பாளர்கள் மற்றும் தனிப்பயன் விதிகளை ஒரு கட்டுப்பாட்டில் இணைக்கவும்.

குழு-நிலை சரிபார்ப்பாளர் மற்றும் updateOn

import { AbstractControl, ValidationErrors } from '@angular/forms';

function samePassword(group: AbstractControl): ValidationErrors | null {
  const pass = group.get('pass')?.value;
  const confirm = group.get('confirm')?.value;
  return pass === confirm ? null : { mismatch: true };
}

const form = fb.group(
  { pass: [''], confirm: [''] },
  { validators: samePassword, updateOn: 'blur' }
);

வழிகாட்டுதல்கள்:

  • குழு-நிலை சரிபார்ப்பாளர்கள்: குறுக்கு-புல விதிகளுக்கு (எ.கா., கடவுச்சொல் பொருத்தம்) பயன்படுத்தவும்.
  • updateOn உடன் சரக்கைக் குறைக்கவும்: பொருத்தமானபோது updateOn: 'blur' | 'submit' (அந்த நிகழ்வு வரை சரிபார்ப்பு/மதிப்பு மாற்றங்களை தாமதப்படுத்தவும்) பயன்படுத்தவும்.
  • touched/dirty அடிப்படையில் பிழைகளைக் காட்டவும்: சத்தமான பயனர் அனுபவத்தைத் தவிர்க்க.
  • அசிங்க்ரோனஸ் சரிபார்ப்பாளர்கள்: விரைவாகவும் ரத்து செய்யக்கூடியதாகவும் இருக்க வேண்டும்; சேவையக சரிபார்ப்புகளைத் தொடங்குவதற்கு முன் உள்ளீடுகளை debounce செய்யவும்.

படிவ புதுப்பிப்பு மூலோபாயங்கள்

முறை தொடரியல் பயன்பாடு எச்சரிக்கை
setValue form.setValue(fullObject) முழு படிவத்தைப் புதுப்பிக்க முழு வடிவம் தேவை; பகுதி புதுப்பிப்புகளுக்கு தோல்வி
patchValue form.patchValue(partialObject) பகுதி புதுப்பிப்புகள் இல்லாத புலங்களை பாதுகாப்பாகப் புறக்கணிக்கிறது
reset form.reset(initialState) படிவத்தை மீட்டமைக்க நிலை/தொடுதலை மீட்டமைக்கிறது
updateOn: 'blur' fb.group(..., {updateOn: 'blur'}) சரிபார்ப்பைக் குறைக்க மதிப்பு மாற்றங்கள் blur வரை தாமதமாகும்
updateOn: 'submit' fb.group(..., {updateOn: 'submit'}) அதிகபட்ச செயல்திறன் சமர்ப்பிக்கும் வரை எந்த சரிபார்ப்பும் இல்லை

ஜாஸிஃப் குழு பரிந்துரை:

  • பெரும்பாலான புதுப்பிப்புகளுக்கு patchValue பயன்படுத்தவும்: இது பாதுகாப்பானது மற்றும் குறைவான பிழைகளைக் கொண்டுள்ளது.
  • சிக்கலான படிவங்களுக்கு updateOn: 'blur' பயன்படுத்தவும்: ஒவ்வொரு விசை அழுத்தத்திலும் சரிபார்ப்பைத் தவிர்க்கிறது.
  • valueChanges க்கு கவனம் செலுத்துங்கள்: எதிர்வினை தர்க்கத்திற்காக, ஆனால் சூழ்நிலை சார்ந்த unsubscribe.
  • படிவ நிலையை சேவைகளில் வைத்திருக்கவும்: வழிசெலுத்தல் முழுவதும் படிவ நிலையைப் பாதுகாக்க.

மேம்பட்ட படிவ முறைகள்

படிவ நிலை மீட்டமைப்பு

பயனர் வெளியேறிய பிறகு படிவ தரவைப் பாதுகாக்கவும்.

form.patchValue(savedState)

டைனமிக் சரிபார்ப்பு

பிற புல மதிப்புகளின் அடிப்படையில் சரிபார்ப்பு விதிகளை மாற்றவும்.

control.setValidators([...])

படிவ பகுதி

மறுபயன்பாட்டிற்காக கூடிய படிவ குழுக்களைக் கூறுகளாகப் பிரிக்கவும்.

@Component({ selector: 'address-form' })

எதிர்வினை கண்காணிப்பு

valueChanges மற்றும் statusChanges ஐப் பயன்படுத்தி படிவ மாற்றங்களைக் கண்காணிக்கவும்.

form.valueChanges.subscribe(...)

பயிற்சி

ரியாக்டிவ் படிவங்களில் டைனமிக் பட்டியல்களுக்கு எந்த கட்டமைப்பு சிறந்தது?

சரியான பதிலைத் தேர்ந்தெடுக்கவும்:

FormArray
✓ சரி! FormArray டைனமிக் பட்டியல்களுக்கு சிறந்தது. இது கட்டுப்பாடுகள் அல்லது குழுக்களின் வரிசைப்படுத்தப்பட்ட பட்டியலை வைத்திருக்கிறது, அதன் நீளம் இயக்க நேரத்தில் மாறக்கூடியது, டேக்குகள், உருப்படிகள் அல்லது டைனமிக் வரிசைகள் போன்றவற்றுக்கு ஏற்றது.
FormGroup
✗ தவறு! FormGroup நிலையான, அறியப்பட்ட புலங்களின் தொகுப்பிற்கு சிறந்தது. இது டைனமிக் பட்டியல்களுக்கு உகந்ததல்ல, ஏனெனில் அதன் கட்டமைப்பு இயக்க நேரத்தில் மாறாது.
FormControl
✗ தவறு! FormControl ஒற்றை உள்ளீட்டு மதிப்புக்கு மட்டுமே. இது பல உருப்படிகளைக் கொண்ட பட்டியல்களைக் கையாள முடியாது. பல உருப்படிகளுக்கு FormArray பயன்படுத்தவும்.
அடுத்தது