Angular Forms দুটি মূল পদ্ধতিতে কাজ করে— Template-driven Forms এবং Reactive Forms। যেখানে Template-driven Forms সাধারণত সিম্পল ফর্মের জন্য ব্যবহৃত হয়, সেখানে Reactive Forms আরও জটিল এবং ডায়নামিক ফর্মসের জন্য উপযুক্ত।
এখানে, Advanced Forms বিষয়টি Reactive Forms এর উন্নত ব্যবহার নিয়ে আলোচনা করবে, যেখানে FormGroup, FormControl, FormArray, Validators, Async Validators, Custom Validators এবং Form Arrays নিয়ে গভীরভাবে আলোচনা করা হবে। এগুলো Angular ফর্মের শক্তিশালী ফিচার যা ফর্মের সঠিকতা, কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।
Reactive Forms (বা Model-driven Forms) এমন একটি ফর্ম মডেল যেখানে ফর্মের স্টেট, ভ্যালিডেশন, এবং অন্যান্য কার্যকলাপ সম্পূর্ণভাবে কম্পোনেন্ট ক্লাসের মাধ্যমে পরিচালিত হয়। Reactive Forms সাধারণত একাধিক ফর্ম কন্ট্রোল, ডায়নামিক কন্ট্রোল এবং অ্যাসিঙ্ক্রোনাস ভ্যালিডেশন প্রয়োজন হলে ব্যবহৃত হয়।
Reactive Forms ব্যবহারের জন্য Angular অ্যাপ্লিকেশনে ReactiveFormsModule আমদানি করতে হবে।
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [ReactiveFormsModule],
})
export class AppModule {}
FormControl, FormGroup, এবং FormArray হল Reactive Forms-এ ব্যবহৃত প্রধান কম্পোনেন্ট।
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
@Component({
selector: 'app-user-form',
templateUrl: './user-form.component.html',
})
export class UserFormComponent {
userName = new FormControl('');
}
এখানে, userName
একটি FormControl যা ইনপুট ফিল্ডের মান স্টোর করবে।
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-registration-form',
templateUrl: './registration-form.component.html',
})
export class RegistrationFormComponent {
registrationForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
email: new FormControl('')
});
}
এখানে, FormGroup এর মধ্যে তিনটি FormControl রয়েছে, যেগুলি একসাথে একটি ফর্ম গঠন করে।
import { Component } from '@angular/core';
import { FormGroup, FormArray, FormControl } from '@angular/forms';
@Component({
selector: 'app-user-skills',
templateUrl: './user-skills.component.html',
})
export class UserSkillsComponent {
skillsForm = new FormGroup({
skills: new FormArray([new FormControl('Angular')])
});
get skills() {
return this.skillsForm.get('skills') as FormArray;
}
addSkill() {
this.skills.push(new FormControl(''));
}
}
এখানে, FormArray ব্যবহার করা হয়েছে যা একাধিক ফর্ম কন্ট্রোল ধারণ করতে পারে (যেমন একাধিক স্কিল ইনপুট ফিল্ড)।
Validators হল Angular Forms-এর একটি গুরুত্বপূর্ণ অংশ, যা ফর্ম কন্ট্রোলের ইনপুট যাচাই করতে ব্যবহৃত হয়। এটি সিঙ্গেল এবং অ্যাসিঙ্ক্রোনাস ভ্যালিডেশন হিসেবে কাজ করতে পারে।
import { FormControl, Validators } from '@angular/forms';
export class RegistrationFormComponent {
email = new FormControl('', [Validators.required, Validators.email]);
}
এখানে, Validators.required এবং Validators.email দুটি ভ্যালিডেশন অ্যাপ্লাই করা হয়েছে email ফর্ম কন্ট্রোলে।
আপনি Custom Validator তৈরি করতে পারেন যা আপনার নির্দিষ্ট লজিক অনুসারে ফর্ম ইনপুট যাচাই করবে।
import { AbstractControl, ValidationErrors } from '@angular/forms';
export function forbiddenNameValidator(control: AbstractControl): ValidationErrors | null {
const forbidden = /admin/.test(control.value);
return forbidden ? { forbiddenName: { value: control.value } } : null;
}
এখানে, forbiddenNameValidator একটি কাস্টম ভ্যালিডেটর যা admin শব্দটি ফর্মের ইনপুটে থাকলে তা নিষিদ্ধ করে।
Async Validators হল এমন ভ্যালিডেটর যা সার্ভারের সাথে যোগাযোগ করে এবং অ্যাসিঙ্ক্রোনাসভাবে ইনপুট যাচাই করে। এটি সাধারণত HTTP রিকোয়েস্ট বা এপিআই কল করার জন্য ব্যবহৃত হয়।
import { Observable } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';
import { AbstractControl, AsyncValidatorFn, ValidationErrors } from '@angular/forms';
export function checkEmailTaken(control: AbstractControl): Observable<ValidationErrors | null> {
return new Observable(observer => {
setTimeout(() => {
if (control.value === 'test@example.com') {
observer.next({ emailTaken: true });
} else {
observer.next(null);
}
observer.complete();
}, 1000);
});
}
এখানে, checkEmailTaken একটি অ্যাসিঙ্ক্রোনাস ভ্যালিডেটর যা নির্দিষ্ট একটি ইমেইল চেক করে।
আপনার ফর্ম সাবমিট করার আগে অবশ্যই ফর্মের ভ্যালিডেশন চেক করা উচিত। এটি করার জন্য form.valid
এবং form.invalid
প্রপার্টি ব্যবহার করা হয়।
onSubmit() {
if (this.registrationForm.valid) {
console.log('Form Submitted!', this.registrationForm.value);
} else {
console.log('Form is invalid');
}
}
এখানে, ফর্ম সাবমিট করার আগে registrationForm.valid
প্রপার্টি দিয়ে ফর্মটি যাচাই করা হচ্ছে।
কখনও কখনও আমাদের ফর্মে ডায়নামিক কন্ট্রোল (যেমন নতুন ইনপুট ফিল্ড বা কন্ট্রোল) যোগ করতে হয়। Angular Reactive Forms এই কাজটি খুব সহজে পরিচালনা করতে সহায়ক।
addControl() {
const control = new FormControl('', Validators.required);
(this.registrationForm.get('skills') as FormArray).push(control);
}
এখানে, একটি নতুন কন্ট্রোল skills ফর্ম অ্যারে তে ডায়নামিকভাবে যোগ করা হচ্ছে।
Angular Reactive Forms এডভান্সড ফিচারগুলি, যেমন FormControl, FormGroup, FormArray, Validators, Async Validators, এবং Custom Validators ব্যবহার করে, আপনাকে জটিল এবং ডায়নামিক ফর্ম তৈরি করতে সাহায্য করে। এই ফিচারগুলো Angular ফর্মের কার্যকারিতা, ভ্যালিডেশন এবং ইউজার ইন্টারফেসে এক্সটেনসিভ কাস্টমাইজেশন করতে সহায়তা করে। Reactive Forms পদ্ধতি ব্যবহারে ফর্মের পুরো স্টেট এবং লজিক আপনার কম্পোনেন্টে থাকতে পারে, যা আরও শক্তিশালী এবং নিয়ন্ত্রিত অ্যাপ্লিকেশন তৈরি করতে সক্ষম।
Angular-এ ডাইনামিক ফর্মস তৈরি করা যায়, যেখানে ফর্মের এলিমেন্টগুলো রানটাইমে পরিবর্তন করা হয়। Angular ফর্ম দুটি প্রধানভাবে পরিচালনা করতে পারে: Template-driven forms এবং Reactive forms। ডাইনামিক ফর্ম তৈরির জন্য সাধারণত Reactive Forms ব্যবহার করা হয়, কারণ এটি বেশি কাস্টমাইজেশন এবং কন্ট্রোল সরবরাহ করে। ডাইনামিক ফর্মের মাধ্যমে আপনি কনট্রোল, ভ্যালিডেশন এবং লেআউটকে কোডের মাধ্যমে নিয়ন্ত্রণ করতে পারেন।
Reactive Forms Angular-এর একটি শক্তিশালী ফিচার, যা ফর্মের ডেটা এবং স্টেট ম্যানেজমেন্ট খুব সহজে করতে সাহায্য করে। ডাইনামিক ফর্ম তৈরির জন্য, আপনি ফর্ম কন্ট্রোল (FormControl) এবং ফর্ম গ্রুপ (FormGroup) ব্যবহার করতে পারেন। এটি আপনাকে ফর্মের ক্ষেত্রগুলো চলতি সময়ে অ্যাড, রিমুভ, অথবা আপডেট করতে সহায়তা করে।
প্রথমে, আপনাকে ReactiveFormsModule মডিউলটি ইম্পোর্ট করতে হবে app.module.ts
ফাইলে:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms'; // Import ReactiveFormsModule
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule // Add ReactiveFormsModule here
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
ধরা যাক, আমাদের একটি ফর্ম আছে, যেখানে আমরা রিয়েল টাইমে ইনপুট ফিল্ড অ্যাড বা রিমুভ করতে চাই।
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';
@Component({
selector: 'app-dynamic-form',
template: `
<form [formGroup]="dynamicForm" (ngSubmit)="onSubmit()">
<div formArrayName="items">
<div *ngFor="let item of items.controls; let i = index">
<div [formGroupName]="i">
<input formControlName="name" placeholder="Item Name" />
<input formControlName="value" placeholder="Item Value" />
<button (click)="removeItem(i)">Remove</button>
</div>
</div>
</div>
<button (click)="addItem()">Add Item</button>
<button type="submit" [disabled]="dynamicForm.invalid">Submit</button>
</form>
`,
})
export class DynamicFormComponent {
dynamicForm: FormGroup;
constructor(private fb: FormBuilder) {
this.dynamicForm = this.fb.group({
items: this.fb.array([this.createItem()]), // Initial array with one item
});
}
get items() {
return (this.dynamicForm.get('items') as FormArray);
}
createItem(): FormGroup {
return this.fb.group({
name: ['', Validators.required],
value: ['', Validators.required],
});
}
addItem() {
this.items.push(this.createItem());
}
removeItem(index: number) {
this.items.removeAt(index);
}
onSubmit() {
console.log(this.dynamicForm.value);
}
}
fb.group()
এবং fb.array()
ব্যবহার করে আমরা ফর্ম গ্রুপ এবং ফর্ম অ্যারে তৈরি করি।FormArray
তে যোগ করে।ডাইনামিক ফর্মে আপনি ফর্ম কন্ট্রোলের উপর ভ্যালিডেশনও অ্যাপ্লাই করতে পারেন। উপরের উদাহরণে, name
এবং value
ফিল্ডে Validators.required
ব্যবহার করা হয়েছে, যাতে ফিল্ডগুলো ফাঁকা না থাকে।
আপনি কাস্টম ভ্যালিডেটরও তৈরি করতে পারেন যা ফর্ম কন্ট্রোলের ভ্যালিডেশন চেক করবে। উদাহরণস্বরূপ:
import { AbstractControl, ValidationErrors } from '@angular/forms';
export function nameValidator(control: AbstractControl): ValidationErrors | null {
const value = control.value;
if (value && value.length < 3) {
return { 'nameTooShort': true };
}
return null;
}
এই কাস্টম ভ্যালিডেটরটি name
ফিল্ডে প্রয়োগ করা যেতে পারে, যাতে সেটি কমপক্ষে ৩ ক্যারেক্টার দীর্ঘ হয়।
Angular-এ ডাইনামিক ফর্ম তৈরি করা খুবই সহজ এবং শক্তিশালী একটি বৈশিষ্ট্য। এটি Reactive Forms ব্যবহার করে করা যায়, যা আপনাকে ফর্ম কন্ট্রোল, গ্রুপ, এবং অ্যারে নিয়ন্ত্রণ করার সুবিধা দেয়। Angular CLI এবং ReactiveFormsModule ব্যবহারের মাধ্যমে ডাইনামিক ফর্ম তৈরি করতে পারেন, যেখানে আপনি ফর্মের ইনপুট ফিল্ডগুলো যোগ, মুছে, অথবা আপডেট করতে পারবেন।
Angular-এ Reactive Forms এর মধ্যে FormArray একটি বিশেষ ফিচার, যা ডায়নামিক এবং ভ্যারিয়েবল আকারের ফর্ম কন্ট্রোল তৈরি করতে সহায়তা করে। FormArray মূলত এমন একটি ফর্ম কন্টেইনার, যেখানে আপনি একাধিক ফর্ম কন্ট্রোল যুক্ত করতে পারেন এবং এটি ফর্মের প্রতিটি কন্ট্রোলের জন্য একটি অ্যারে ধারণ করে।
Reactive Forms এর মধ্যে FormArray ব্যবহৃত হয় যখন আপনাকে একই ধরনের একাধিক ইনপুট ফিল্ডের মান সংগ্রহ করতে হয়, যেমন একাধিক ইমেইল বা ফোন নাম্বার ইনপুট করা।
FormArray একটি অ্যারে ধারণ করে, যেখানে একাধিক FormControl, FormGroup অথবা আরও অন্য FormArray থাকতে পারে। এটি আপনাকে ফর্মের কন্ট্রোলগুলো একটি ডাইনামিক পদ্ধতিতে পরিচালনা করতে দেয়, এবং আপনি runtime এ কন্ট্রোল যোগ বা মুছে ফেলতে পারেন।
Reactive Forms ব্যবহারে FormArray তৈরি করতে প্রথমে FormBuilder এবং FormArray ব্যবহার করতে হবে।
প্রথমে, AppModule
-এ ReactiveFormsModule ইম্পোর্ট করতে হবে:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms'; // Import ReactiveFormsModule
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule // Add ReactiveFormsModule here
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Angular Reactive Forms ব্যবহার করে FormArray তৈরি করা হয় এবং ফর্মের কন্ট্রোলগুলো যোগ করা হয়। এখানে একটি উদাহরণ দেওয়া হলো যেখানে FormArray ব্যবহার করে একাধিক email ইনপুট ফিল্ড তৈরি করা হচ্ছে:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';
@Component({
selector: 'app-root',
template: `
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div formArrayName="emails">
<div *ngFor="let email of emailControls(); let i = index">
<input [formControlName]="i" placeholder="Enter Email" />
<button (click)="removeEmail(i)">Remove</button>
</div>
</div>
<button type="button" (click)="addEmail()">Add Email</button>
<button type="submit" [disabled]="!myForm.valid">Submit</button>
</form>
`
})
export class AppComponent implements OnInit {
myForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.myForm = this.fb.group({
emails: this.fb.array([this.createEmail()]) // Create initial FormArray with one email
});
}
get emails(): FormArray {
return this.myForm.get('emails') as FormArray;
}
emailControls() {
return (this.myForm.get('emails') as FormArray).controls;
}
createEmail(): FormGroup {
return this.fb.group({
email: ['', [Validators.required, Validators.email]]
});
}
addEmail() {
this.emails.push(this.createEmail());
}
removeEmail(i: number) {
this.emails.removeAt(i);
}
onSubmit() {
console.log(this.myForm.value);
}
}
Angular এর FormArray ক্লাসে কিছু গুরুত্বপূর্ণ মেথড রয়েছে যেগুলি ব্যবহার করে আপনি ফর্ম কন্ট্রোলগুলোকে ম্যানিপুলেট করতে পারবেন:
নতুন ফর্ম কন্ট্রোল যোগ করার জন্য push() মেথড ব্যবহার করা হয়:
this.emails.push(this.createEmail()); // Adds a new email FormGroup
একটি নির্দিষ্ট ইনডেক্সে থাকা ফর্ম কন্ট্রোল মুছে ফেলতে removeAt() মেথড ব্যবহার করা হয়:
this.emails.removeAt(index); // Removes the email FormGroup at the specified index
ফর্ম অ্যারেটি সম্পূর্ণভাবে ফাঁকা করতে clear() মেথড ব্যবহার করা হয়:
this.emails.clear(); // Removes all email FormGroups
FormArray এর মধ্যে থাকা সমস্ত কন্ট্রোল অ্যাক্সেস করতে controls প্রোপার্টি ব্যবহার করা হয়:
let controls = this.emails.controls; // Accesses all form controls inside FormArray
FormArray এর মধ্যে যে কন্ট্রোলগুলো রয়েছে, সেগুলির উপর validation অ্যাপ্লাই করা যেতে পারে। এক্ষেত্রে, প্রতিটি কন্ট্রোলের জন্য আলাদা আলাদা Validators ব্যবহার করা হয়।
createEmail(): FormGroup {
return this.fb.group({
email: ['', [Validators.required, Validators.email]] // Validation added
});
}
FormArray আপনাকে Angular অ্যাপ্লিকেশনের ফর্মস তৈরি ও ম্যানেজমেন্টে আরও নমনীয়তা এবং শক্তি প্রদান করে।
Angular-এ কাস্টম ভ্যালিডেটর একটি কাস্টম ফাংশন যা ফর্ম কন্ট্রোলের মান যাচাই করতে ব্যবহৃত হয়। আপনি যখন একটি নির্দিষ্ট শর্তের অধীনে মান যাচাই করতে চান, যেমন পাসওয়ার্ড শক্তি বা ইমেইল ঠিকানা নির্দিষ্ট ফরম্যাটে না হওয়া, তখন কাস্টম ভ্যালিডেটর খুব কার্যকরী হয়। Angular ফর্মে দুই ধরনের ভ্যালিডেটর থাকে: সিঙ্গেল ভ্যালিডেটর (যেমন required
, minLength
) এবং কাস্টম ভ্যালিডেটর।
কাস্টম ভ্যালিডেটর তৈরি করার মাধ্যমে আপনি ফর্ম কন্ট্রোলের মানের উপর নিয়ন্ত্রণ বাড়াতে পারেন।
কাস্টম ভ্যালিডেটর একটি ফাংশন হিসেবে তৈরি করা হয়, যা একটি AbstractControl
(যেমন FormControl
, FormGroup
, ইত্যাদি) ইনপুট হিসেবে গ্রহণ করে এবং একটি ValidationErrors অবজেক্ট ফেরত দেয়। যদি ভ্যালিডেশন সফল হয়, তাহলে null
ফেরত দেয়, অন্যথায় একটি ত্রুটি অবজেক্ট ফেরত দেয়।
import { AbstractControl, ValidationErrors } from '@angular/forms';
export function customValidator(control: AbstractControl): ValidationErrors | null {
// এখানে আপনার কাস্টম ভ্যালিডেশন লজিক থাকবে
if (control.value && control.value.length < 5) {
return { 'minLengthError': 'Value must be at least 5 characters long' };
}
return null; // যদি কোনো ত্রুটি না থাকে
}
এখানে, control.value
মান যাচাই করা হচ্ছে। যদি এটি 5 অক্ষরের কম হয়, তাহলে একটি ত্রুটি অবজেক্ট ফেরত দিচ্ছে। null
ফেরত দিলে মানটি ভ্যালিড হিসেবে গণ্য হবে।
কাস্টম ভ্যালিডেটরটি FormControl অথবা FormGroup-এ ব্যবহার করা হয়, যেখানে আপনি ফর্ম কন্ট্রোলের জন্য কাস্টম ভ্যালিডেশন নির্ধারণ করতে পারেন।
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { customValidator } from './custom-validator';
@Component({
selector: 'app-my-form',
template: `
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<label for="myInput">Enter text:</label>
<input id="myInput" formControlName="myInput" />
<div *ngIf="myForm.get('myInput').hasError('minLengthError')">
Minimum length is 5 characters.
</div>
<button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>
`
})
export class MyFormComponent {
myForm: FormGroup;
constructor(private fb: FormBuilder) {
this.myForm = this.fb.group({
myInput: ['', [Validators.required, customValidator]] // কাস্টম ভ্যালিডেটর ব্যবহার করা হয়েছে
});
}
onSubmit() {
if (this.myForm.valid) {
console.log('Form Submitted', this.myForm.value);
} else {
console.log('Form is invalid');
}
}
}
এখানে, myInput
নামক ফর্ম কন্ট্রোলটি required এবং customValidator ব্যবহার করে ভ্যালিডেট করা হচ্ছে। যদি ব্যবহারকারী ৫ অক্ষরের কম ইনপুট দেয়, তাহলে একটি ত্রুটি মেসেজ দেখানো হবে।
কাস্টম ভ্যালিডেটর শুধু সিঙ্ক্রোনাস নয়, আপনি অ্যাসিঙ্ক্রোনাস ভ্যালিডেটরও তৈরি করতে পারেন। অ্যাসিঙ্ক্রোনাস ভ্যালিডেটর সাধারণত যখন HTTP রিকোয়েস্টের মাধ্যমে কোনো মান যাচাই করতে হয় তখন ব্যবহার করা হয় (যেমন, ডাটাবেসে ইউজারনেমের স্বতন্ত্রতা চেক করা)।
import { AbstractControl, ValidationErrors } from '@angular/forms';
import { Observable, of } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';
export function asyncCustomValidator(control: AbstractControl): Observable<ValidationErrors | null> {
return of(control.value).pipe(
debounceTime(300), // কিছু সময়ের জন্য অপেক্ষা করতে হবে
switchMap(value => {
// এখানে আপনি HTTP রিকোয়েস্ট ব্যবহার করতে পারেন
return value === 'existingUsername' ? of({ 'usernameTaken': true }) : of(null);
})
);
}
এই অ্যাসিঙ্ক্রোনাস ভ্যালিডেটরে, যদি ইনপুটের মান existingUsername
হয়, তাহলে একটি ত্রুটি ফেরত দেবে। অন্যথায় null
ফেরত দেবে, যা মানকে বৈধ হিসেবে গণ্য করবে।
this.myForm = this.fb.group({
username: ['', [Validators.required], [asyncCustomValidator]] // অ্যাসিঙ্ক্রোনাস ভ্যালিডেটর ব্যবহার
});
এখানে, username
ফর্ম কন্ট্রোলে asyncCustomValidator যুক্ত করা হয়েছে, যা আসন্ন ইউজারনেমের জন্য অ্যাসিঙ্ক্রোনাস ভ্যালিডেশন পরিচালনা করবে।
Angular-এ কাস্টম ভ্যালিডেটর আপনাকে আপনার অ্যাপ্লিকেশনের ফর্ম কন্ট্রোলের জন্য কাস্টম ভ্যালিডেশন লজিক তৈরি এবং প্রয়োগ করতে সাহায্য করে। আপনি সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস ভ্যালিডেটর তৈরি করতে পারেন, যা আপনাকে আপনার অ্যাপ্লিকেশনের ব্যাবহারকারীর ইনপুট যাচাই করার আরও নিয়ন্ত্রণ দেয়।