Angular ফর্মস ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে ব্যবহারকারী ইনপুট সংগ্রহ করতে পারেন। Angular ফর্ম দুটি প্রধান ধরনের সরবরাহ করে: Template-driven Forms এবং Reactive Forms। এই দুই ধরনের ফর্মের মধ্যকার প্রধান পার্থক্য হল কিভাবে তারা পরিচালিত হয় এবং কিভাবে ডেটা মডেলিং করা হয়।
Template-driven Forms Angular ফর্মের একটি সহজ এবং declarative পদ্ধতি। এই ফর্মের জন্য ফর্ম কন্ট্রোলগুলি HTML টেমপ্লেটের মধ্যেই সংজ্ঞায়িত করা হয়। ব্যবহারকারী ইন্টারফেসে ডেটা বাইন্ডিং এবং ফর্মের ভ্যালিডেশন HTML টেমপ্লেটের মাধ্যমে সরাসরি করা হয়।
প্রথমে, Angular অ্যাপ্লিকেশনকে FormsModule ইমপোর্ট করতে হবে:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms'; // FormsModule ইমপোর্ট
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, FormsModule], // FormsModule এখানে যুক্ত হবে
bootstrap: [AppComponent]
})
export class AppModule { }
এখন, HTML টেমপ্লেটে ngModel
ব্যবহার করে ফর্ম তৈরি করা যেতে পারে:
<form #userForm="ngForm">
<label for="name">Name:</label>
<input type="text" id="name" name="name" [(ngModel)]="user.name" #name="ngModel" required>
<div *ngIf="name.invalid && name.touched">Name is required.</div>
<button [disabled]="userForm.invalid" (click)="submitForm()">Submit</button>
</form>
এখানে:
[(ngModel)]
ডেটা বাইন্ডিং ব্যবহার করে ইউজারের ইনপুটকে কম্পোনেন্টের প্রোপার্টি user.name
এর সাথে সংযুক্ত করা হয়।#userForm="ngForm"
ফর্মের রেফারেন্স এবং ভ্যালিডেশন ব্যবহার করার জন্য।required
হল ফিল্ড ভ্যালিডেশনের একটি সাধারণ নিয়ম।কম্পোনেন্ট ক্লাসে:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
user = { name: '' };
submitForm() {
console.log(this.user);
}
}
Reactive Forms Angular ফর্মের আরও উন্নত এবং স্কেলেবল পদ্ধতি। এটি একটি প্রোগ্রাম্যাটিক পদ্ধতি, যেখানে আপনি ফর্মের কন্ট্রোল, ভ্যালিডেশন এবং স্টেট ম্যানেজমেন্টকে কম্পোনেন্ট ক্লাসের মধ্যে কোডের মাধ্যমে নিয়ন্ত্রণ করেন।
প্রথমে, Angular অ্যাপ্লিকেশনকে ReactiveFormsModule ইমপোর্ট করতে হবে:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms'; // ReactiveFormsModule ইমপোর্ট
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, ReactiveFormsModule], // ReactiveFormsModule এখানে যুক্ত হবে
bootstrap: [AppComponent]
})
export class AppModule { }
এখন, Reactive form তৈরি করতে হবে:
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
userForm: FormGroup;
constructor() {
this.userForm = new FormGroup({
name: new FormControl('', [Validators.required]),
email: new FormControl('', [Validators.required, Validators.email])
});
}
submitForm() {
console.log(this.userForm.value);
}
}
এখানে:
FormGroup
এবং FormControl
ব্যবহার করে ফর্মের কন্ট্রোলগুলি প্রোগ্রাম্যাটিক্যালি তৈরি করা হয়।Validators.required
এবং Validators.email
ব্যবহার করে ভ্যালিডেশন করা হয়।HTML টেমপ্লেটে Reactive form এর জন্য:
<form [formGroup]="userForm" (ngSubmit)="submitForm()">
<label for="name">Name:</label>
<input type="text" id="name" formControlName="name">
<label for="email">Email:</label>
<input type="email" id="email" formControlName="email">
<button type="submit" [disabled]="userForm.invalid">Submit</button>
</form>
এখানে:
[formGroup]
ডিরেক্টিভ দ্বারা userForm
কে HTML ফর্মের সাথে যুক্ত করা হয়েছে।formControlName
দ্বারা প্রতিটি ইনপুট ফিল্ডকে নির্দিষ্ট FormControl
এর সাথে সংযুক্ত করা হয়েছে।ফর্ম ভ্যালিডেশন Angular ফর্মে দুটি মূল পদ্ধতিতে করা যায়:
Validators
ব্যবহার করে প্রোগ্রাম্যাটিক ভ্যালিডেশন।Template-driven ফর্মে:
<input type="text" name="username" [(ngModel)]="user.username" required>
Reactive ফর্মে:
username: new FormControl('', [Validators.required])
Angular ফর্মস দিয়ে আপনি আপনার অ্যাপ্লিকেশনের ইউজার ইনপুট খুব সহজে গ্রহণ করতে পারেন এবং দুই ধরনের ফর্ম ব্যবহার করতে পারেন: Template-driven Forms এবং Reactive Forms। Template-driven Forms সহজ এবং declarative, যেখানে Reactive Forms শক্তিশালী এবং প্রোগ্রাম্যাটিক্যালি নিয়ন্ত্রিত। Angular-এ ফর্ম ভ্যালিডেশন এবং ডেটা ম্যানেজমেন্ট সহজেই করতে পারেন এই ফর্মের মাধ্যমে।
Angular-এ ফর্ম তৈরি করার দুটি প্রধান পদ্ধতি রয়েছে: টেম্পলেট-ড্রিভেন ফর্মস এবং রিঅ্যাকটিভ ফর্মস। এই টিউটোরিয়ালে আমরা টেম্পলেট-ড্রিভেন ফর্মস সম্পর্কে আলোচনা করব, যা Angular-এ ফর্ম তৈরি এবং পরিচালনার সবচেয়ে সহজ এবং প্রচলিত পদ্ধতি।
টেম্পলেট-ড্রিভেন ফর্মগুলো কম্পোনেন্টের টেমপ্লেটের মধ্যে তৈরি করা হয় এবং খুব কম কোডের মাধ্যমে ফর্মের মান ও তার ভ্যালিডেশন পরিচালনা করা যায়। এটি সাধারণত সহজ ফর্মের জন্য ব্যবহৃত হয় যেখানে কমপ্লেক্স লজিকের প্রয়োজন হয় না।
টেম্পলেট-ড্রিভেন ফর্মস হলো এমন ফর্ম যেখানে ফর্মের উপাদানগুলো মূলত HTML টেমপ্লেটে ডিফাইন করা হয়, এবং Angular ফর্মের মান এবং তার ভ্যালিডেশন পরিচালনা করে টেমপ্লেটের মাধ্যমে। এতে আপনি HTML ট্যাগের মধ্যে ফর্ম কন্ট্রোল এবং ভ্যালিডেশন নির্দিষ্ট করেন, এবং Angular ফর্মের স্টেট ও কার্যকারিতা পরিচালনা করে।
টেম্পলেট-ড্রিভেন ফর্ম তৈরি করতে প্রথমে FormsModule
ইম্পোর্ট করতে হবে। এটি Angular অ্যাপ্লিকেশনের মূল মডিউলে (অথবা যেখানে ফর্ম ব্যবহার করতে চান সেখানে) যুক্ত করা হয়।
FormsModule
ইম্পোর্ট করাপ্রথমে FormsModule
কে আপনার অ্যাপ্লিকেশনের মডিউলে ইম্পোর্ট করতে হবে:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms'; // FormsModule ইম্পোর্ট করা
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule // FormsModule ইম্পোর্ট করা
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
এখানে, FormsModule
অ্যাপ্লিকেশনে ফর্ম ব্যবহারের জন্য প্রয়োজনীয় ডিরেক্টিভস এবং সার্ভিস সরবরাহ করে।
এবার, HTML টেমপ্লেট-এ ফর্ম কন্ট্রোল তৈরি করা হবে। আপনি ngModel
ডিরেক্টিভটি ব্যবহার করে ইনপুট ফিল্ডের মান ও স্টেট নিয়ন্ত্রণ করবেন।
<!-- app.component.html -->
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" [(ngModel)]="model.name" required>
</div>
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" [(ngModel)]="model.email" required>
</div>
<button type="submit" [disabled]="!myForm.valid">Submit</button>
</form>
এখানে:
[(ngModel)]="model.name"
এবং [(ngModel)]="model.email"
ডেটা বাইন্ডিং এর মাধ্যমে ইনপুট ফিল্ডের মান কম্পোনেন্টের model
অবজেক্টে ব্যাকআপ করছে।#myForm="ngForm"
ফর্মের একটি রেফারেন্স তৈরি করছে, যার মাধ্যমে আপনি ফর্মের ভ্যালিডেশন এবং এর স্টেট অ্যাক্সেস করতে পারবেন।এখন, কম্পোনেন্টে ফর্মের জন্য ডেটা মডেল এবং সাবমিট ফাংশন তৈরি করতে হবে:
// app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
model = { name: '', email: '' }; // ডেটা মডেল
onSubmit(form: any): void {
console.log('Form Submitted:', form);
console.log('Model Data:', this.model);
}
}
এখানে, model
অবজেক্টের মান ইনপুট ফিল্ডের মাধ্যমে পরিবর্তিত হচ্ছে এবং onSubmit()
ফাংশনে ফর্মের ডেটা পাঠানো হচ্ছে।
টেম্পলেট-ড্রিভেন ফর্মগুলোতে ভ্যালিডেশন সাধারণত HTML ফর্ম কন্ট্রোলের মাধ্যমে করা হয়। আপনি required
, minlength
, maxlength
, pattern
ইত্যাদি অ্যাট্রিবিউট ব্যবহার করে ফর্ম ফিল্ডে ভ্যালিডেশন যুক্ত করতে পারেন।
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" [(ngModel)]="model.name" required #name="ngModel">
<div *ngIf="name.invalid && name.touched" class="error">
Name is required.
</div>
</div>
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" [(ngModel)]="model.email" required email #email="ngModel">
<div *ngIf="email.invalid && email.touched" class="error">
A valid email is required.
</div>
</div>
<button type="submit" [disabled]="!myForm.valid">Submit</button>
</form>
এখানে:
required
অ্যাট্রিবিউট ইনপুট ফিল্ডের জন্য ভ্যালিডেশন নির্ধারণ করছে।#name="ngModel"
এবং #email="ngModel"
এই রেফারেন্সগুলো ব্যবহার করে আমরা ফর্ম কন্ট্রোলের ভ্যালিডেশন স্টেট (যেমন invalid
এবং touched
) চেক করছি এবং ব্যবহারকারীকে ভুল ইনপুট দেওয়ার জন্য একটি এরর মেসেজ দেখাচ্ছি।টেম্পলেট-ড্রিভেন ফর্মস হল Angular-এ একটি সহজ এবং প্রাথমিক পদ্ধতি, যার মাধ্যমে আপনি কম্পোনেন্টের টেমপ্লেটের মাধ্যমে ফর্ম তৈরি এবং পরিচালনা করতে পারেন। Angular ফর্মের মান এবং ভ্যালিডেশন খুব সহজভাবে ngModel
ডিরেক্টিভ ব্যবহার করে পরিচালিত হয়। এটি ছোট ও সহজ ফর্মগুলির জন্য উপযুক্ত, যেখানে লজিক কম এবং অল্প কোডে ফর্ম তৈরি করা সম্ভব।
Angular-এ রিয়্যাক্টিভ ফর্মস (Reactive Forms) একটি ফর্ম হ্যান্ডলিং পদ্ধতি যা ফর্মের ডেটা এবং ভ্যালিডেশনকে কম্পোনেন্টের ক্লাসে প্রোগ্রামেটিক্যালি ম্যানেজ করতে সহায়ক। রিয়্যাক্টিভ ফর্মস ব্যবহার করলে আপনি ফর্মের অবস্থা এবং লজিককে আরও সহজে ট্র্যাক করতে পারেন এবং এগুলোকে আরও বেশি কন্ট্রোল করতে পারেন।
এটি model-driven অ্যাপ্রোচের একটি অংশ, যেখানে ফর্মের সমস্ত লজিক এবং ডেটা কম্পোনেন্টের ক্লাসে থাকে, এবং ফর্মটি ইউআই (UI) থেকে পৃথক থাকে। রিয়্যাক্টিভ ফর্মস সাধারণত বড়, ডাইনামিক, এবং কমপ্লেক্স ফর্মের জন্য উপযুক্ত।
বৈশিষ্ট্য | রিয়্যাক্টিভ ফর্মস (Reactive Forms) | টেমপ্লেট-ভিত্তিক ফর্মস (Template-driven Forms) |
---|---|---|
ফর্ম ডেটা ম্যানেজমেন্ট | কম্পোনেন্ট ক্লাসে সম্পূর্ণভাবে কন্ট্রোলড | টেমপ্লেটের মাধ্যমে কন্ট্রোলড |
ফর্ম কনফিগারেশন | ফর্ম গ্রুপ এবং কন্ট্রোল দিয়ে তৈরি | ডিরেক্টিভ (যেমন, ngModel ) ব্যবহার করা হয় |
টেস্টিং | সহজভাবে টেস্ট করা যায় | টেস্টিং আরও জটিল হতে পারে |
কন্ট্রোল স্ট্যাটাস | কন্ট্রোল স্ট্যাটাস প্রোগ্রামেটিকভাবে ট্র্যাক করা হয় | কন্ট্রোল স্ট্যাটাস অটোমেটিকভাবে টেমপ্লেট থেকে ট্র্যাক করা হয় |
ReactiveFormsModule ব্যবহার করার জন্য প্রথমে আপনাকে এটি আপনার অ্যাপ মডিউলে ইমপোর্ট করতে হবে।
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { ReactiveFormsModule } from '@angular/forms'; // ReactiveFormsModule ইমপোর্ট করা
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule // মডিউলে ReactiveFormsModule যুক্ত করা
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
রিয়্যাক্টিভ ফর্মের মূল উপাদান হলো FormControl, FormGroup এবং FormArray। এগুলোর মাধ্যমে আপনি ফর্মের কন্ট্রোল এবং ডেটার স্ট্রাকচার তৈরি করেন।
FormControl একটি একক ইনপুট ফিল্ডের মান এবং স্ট্যাটাস ট্র্যাক করার জন্য ব্যবহৃত হয়।
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
@Component({
selector: 'app-root',
template: `<input [formControl]="nameControl">`
})
export class AppComponent {
nameControl = new FormControl('');
}
এখানে, FormControl
দ্বারা একটি ইনপুট ফিল্ড তৈরি করা হয়েছে, যা nameControl
নামক কন্ট্রোল দ্বারা ট্র্যাক হচ্ছে।
FormGroup একাধিক FormControl
বা FormArray
কে গ্রুপ আকারে একত্রিত করে।
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-root',
template: `
<form [formGroup]="userForm">
<input formControlName="name">
<input formControlName="email">
</form>
`
})
export class AppComponent {
userForm = new FormGroup({
name: new FormControl(''),
email: new FormControl('')
});
}
এখানে, FormGroup
দিয়ে দুটি FormControl
(একটি নামের জন্য এবং একটি ইমেইলের জন্য) গ্রুপ করা হয়েছে। formControlName
দিয়ে HTML ফর্মের ইনপুটগুলিকে সংযুক্ত করা হয়।
FormArray ব্যবহার করা হয় যখন একাধিক একই ধরনের কন্ট্রোল (যেমন একাধিক ইনপুট ফিল্ড) প্রয়োজন হয়।
import { Component } from '@angular/core';
import { FormArray, FormControl, FormGroup } from '@angular/forms';
@Component({
selector: 'app-root',
template: `
<form [formGroup]="userForm">
<div formArrayName="addresses">
<div *ngFor="let address of addresses.controls; let i = index">
<input [formControlName]="i">
</div>
</div>
</form>
`
})
export class AppComponent {
userForm = new FormGroup({
addresses: new FormArray([
new FormControl('Address 1'),
new FormControl('Address 2')
])
});
get addresses() {
return (this.userForm.get('addresses') as FormArray);
}
}
এখানে, FormArray
ব্যবহার করে একাধিক ঠিকানা ইনপুট ফিল্ড তৈরি করা হয়েছে। *ngFor
ব্যবহার করে ফর্মের প্রতিটি কন্ট্রোল রেন্ডার করা হচ্ছে।
ফর্ম কন্ট্রোলের সাথে ভ্যালিডেটর যোগ করা যায়, যেটি ফর্মের ইনপুট ভ্যালিড করতে সহায়ক। Angular দুটি ধরনের ভ্যালিডেটর প্রদান করে: সিঙ্গেল ভ্যালিডেটর এবং কম্বিনেশন ভ্যালিডেটর।
import { Component } from '@angular/core';
import { FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-root',
template: `
<input [formControl]="nameControl">
<div *ngIf="nameControl.invalid && nameControl.touched">Name is required</div>
`
})
export class AppComponent {
nameControl = new FormControl('', Validators.required);
}
এখানে, Validators.required
একটি সিঙ্গেল ভ্যালিডেটর যা ইনপুট ফিল্ডটি খালি থাকা চলবে না।
কাস্টম ভ্যালিডেটর ব্যবহার করলে আপনি নিজের ভ্যালিডেশন লজিক তৈরি করতে পারেন।
import { Component } from '@angular/core';
import { FormControl, Validators } from '@angular/forms';
function ageValidator(control: FormControl) {
if (control.value && control.value < 18) {
return { 'ageInvalid': true };
}
return null;
}
@Component({
selector: 'app-root',
template: `
<input [formControl]="ageControl">
<div *ngIf="ageControl.hasError('ageInvalid')">Age must be 18 or older</div>
`
})
export class AppComponent {
ageControl = new FormControl('', ageValidator);
}
এখানে, ageValidator
একটি কাস্টম ভ্যালিডেটর, যা ইউজারের বয়স ১৮ বছরের নিচে হলে ত্রুটি দেখাবে।
ফর্মের ডেটা অ্যাক্সেস করতে form.value
ব্যবহার করা হয় এবং ফর্ম সাবমিট করার জন্য form.submit()
বা ngSubmit
ব্যবহার করা হয়।
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<input formControlName="name">
<button type="submit">Submit</button>
</form>
onSubmit() {
console.log(this.userForm.value);
}
এখানে, onSubmit()
মেথডে ফর্মের ডেটা আউটপুট করা হচ্ছে।
রিয়্যাক্টিভ ফর্মস অ্যাঙ্গুলার অ্যাপ্লিকেশনে শক্তিশালী এবং নমনীয় ফর্ম হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি আপনাকে ফর্ম ডেটা এবং ভ্যালিডেশন কন্ট্রোল করতে সহজ উপায়ে সাহায্য করে এবং বড় এবং জটিল ফর্মের জন্য আদর্শ।
Angular-এ ফর্ম ভ্যালিডেশন ব্যবহার করে ব্যবহারকারীর ইনপুট সঠিক কিনা তা যাচাই করা হয়। Angular দুটি ধরনের ফর্ম সাপোর্ট করে: Template-driven forms এবং Reactive forms। উভয় ধরনের ফর্মে বিল্ট-ইন (built-in) এবং কাস্টম ভ্যালিডেটর ব্যবহার করা যায়।
এখানে আমরা বিল্ট-ইন ভ্যালিডেটর এবং কাস্টম ভ্যালিডেটর তৈরি করার পদ্ধতি আলোচনা করব।
Angular কিছু প্রি-ডিফাইন্ড (built-in) ভ্যালিডেটর সরবরাহ করে, যা সাধারণত ইনপুট ফিল্ডে প্রাথমিক ভ্যালিডেশন করার জন্য ব্যবহৃত হয়। এই ভ্যালিডেটরগুলোকে আপনি Reactive Forms বা Template-driven Forms-এ ব্যবহার করতে পারেন।
Validators.required
: ফিল্ডটি খালি থাকতে পারবে না।Validators.minLength(minLength)
: ফিল্ডের ইনপুটের কমপক্ষে নির্দিষ্ট দৈর্ঘ্য হতে হবে।Validators.maxLength(maxLength)
: ফিল্ডের ইনপুটের দৈর্ঘ্য নির্দিষ্ট মানের বেশি হতে পারবে না।Validators.pattern(pattern)
: ইনপুটটি একটি নির্দিষ্ট রেগুলার এক্সপ্রেশন (Regex) এর সাথে ম্যাচ করতে হবে।Validators.email
: ইনপুটটি একটি বৈধ ইমেইল ফরম্যাটে হতে হবে।Validators.min(minValue)
: ইনপুটের মান একটি নির্দিষ্ট সংখ্যার চেয়ে ছোট হতে পারবে না।Validators.max(maxValue)
: ইনপুটের মান একটি নির্দিষ্ট সংখ্যার চেয়ে বড় হতে পারবে না।import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-login',
templateUrl: './login.component.html'
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
onSubmit() {
if (this.loginForm.valid) {
console.log(this.loginForm.value);
} else {
console.log('Form is invalid');
}
}
}
HTML (login.component.html):
<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
<label for="email">Email:</label>
<input id="email" formControlName="email" />
<div *ngIf="loginForm.get('email').hasError('required') && loginForm.get('email').touched">
Email is required.
</div>
<div *ngIf="loginForm.get('email').hasError('email') && loginForm.get('email').touched">
Invalid email format.
</div>
<label for="password">Password:</label>
<input id="password" formControlName="password" type="password" />
<div *ngIf="loginForm.get('password').hasError('required') && loginForm.get('password').touched">
Password is required.
</div>
<div *ngIf="loginForm.get('password').hasError('minlength') && loginForm.get('password').touched">
Password must be at least 6 characters.
</div>
<button type="submit" [disabled]="loginForm.invalid">Submit</button>
</form>
কাস্টম ভ্যালিডেটর আপনি যখন নিজের ফর্মের জন্য বিশেষ ভ্যালিডেশন কন্ডিশন তৈরি করতে চান, তখন ব্যবহার করা হয়। এটি একটি ফাংশন যা FormControl
বা FormGroup
এর ইনপুট যাচাই করে এবং একটি ত্রুটি অবজেক্ট (error object) রিটার্ন করে যদি কোনো ভুল থাকে।
ধরা যাক, আপনি চান যে পাসওয়ার্ডে কমপক্ষে একটি বড় হাতের অক্ষর এবং একটি সংখ্যা থাকতে হবে।
import { AbstractControl, ValidationErrors } from '@angular/forms';
export function passwordValidator(control: AbstractControl): ValidationErrors | null {
const password = control.value;
if (!password) return null;
const hasUpperCase = /[A-Z]/.test(password);
const hasNumber = /\d/.test(password);
if (!hasUpperCase || !hasNumber) {
return { passwordStrength: 'Password must contain at least one uppercase letter and one number' };
}
return null;
}
এখন এই কাস্টম ভ্যালিডেটরটি ফর্ম গ্রুপের পাসওয়ার্ড ফিল্ডে প্রয়োগ করা হবে।
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { passwordValidator } from './custom-validators';
@Component({
selector: 'app-register',
templateUrl: './register.component.html'
})
export class RegisterComponent {
registerForm: FormGroup;
constructor(private fb: FormBuilder) {
this.registerForm = this.fb.group({
username: ['', Validators.required],
password: ['', [Validators.required, passwordValidator]]
});
}
onSubmit() {
if (this.registerForm.valid) {
console.log(this.registerForm.value);
} else {
console.log('Form is invalid');
}
}
}
HTML (register.component.html):
<form [formGroup]="registerForm" (ngSubmit)="onSubmit()">
<label for="username">Username:</label>
<input id="username" formControlName="username" />
<div *ngIf="registerForm.get('username').hasError('required') && registerForm.get('username').touched">
Username is required.
</div>
<label for="password">Password:</label>
<input id="password" formControlName="password" type="password" />
<div *ngIf="registerForm.get('password').hasError('required') && registerForm.get('password').touched">
Password is required.
</div>
<div *ngIf="registerForm.get('password').hasError('passwordStrength') && registerForm.get('password').touched">
Password must contain at least one uppercase letter and one number.
</div>
<button type="submit" [disabled]="registerForm.invalid">Submit</button>
</form>
Template-driven forms-এ আপনি বিল্ট-ইন ভ্যালিডেটরগুলো সরাসরি HTML টেমপ্লেটে প্রয়োগ করতে পারেন।
<form #form="ngForm" (ngSubmit)="onSubmit(form)">
<label for="email">Email:</label>
<input type="email" id="email" name="email" ngModel required email />
<div *ngIf="form.controls.email?.invalid && form.controls.email?.touched">
<div *ngIf="form.controls.email?.errors?.required">Email is required.</div>
<div *ngIf="form.controls.email?.errors?.email">Invalid email format.</div>
</div>
<label for="password">Password:</label>
<input type="password" id="password" name="password" ngModel required minlength="6" />
<div *ngIf="form.controls.password?.invalid && form.controls.password?.touched">
<div *ngIf="form.controls.password?.errors?.required">Password is required.</div>
<div *ngIf="form.controls.password?.errors?.minlength">Password must be at least 6 characters long.</div>
</div>
<button type="submit" [disabled]="form.invalid">Submit</button>
</form>
Angular ফর্ম ভ্যালিডেশনটি অ্যাপ্লিকেশনের ব্যবহারকারীর ইনপুট যাচাই করার একটি শক্তিশালী উপায়। আপনি বিল্ট-ইন ভ্যালিডেটর ব্যবহার করতে পারেন অথবা কাস্টম ভ্যালিডেটর তৈরি করে নিজস্ব ভ্যালিডেশন কন্ডিশন সেট করতে পারেন। ভ্যালিডেশনটি ফর্মের সঠিকতা এবং ডেটার গুণমান নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Angular-এ ফর্ম ব্যবস্থাপনা করার জন্য Reactive Forms এবং Template-driven Forms দুটি পদ্ধতি রয়েছে। এদের মধ্যে Reactive Forms পদ্ধতি ফর্মের FormGroup এবং FormControl ব্যবহার করে ডেটার ম্যানেজমেন্ট, ভ্যালিডেশন, এবং সাবমিশন সহজভাবে পরিচালনা করতে সহায়ক। এখানে আমরা FormGroup এবং FormControl সম্পর্কে বিস্তারিত আলোচনা করব।
FormGroup একটি গঠনমূলক ক্লাস যা এক বা একাধিক FormControl বা অন্যান্য FormGroup কে একটি ইউনিট হিসেবে সংগঠিত করে। এটি মূলত একাধিক ফর্ম কন্ট্রোলকে একটি গ্রুপে রাখার জন্য ব্যবহৃত হয়, যাতে ফর্মের ডেটা এবং স্টেট ম্যানেজমেন্ট সহজ হয়।
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-user-form',
templateUrl: './user-form.component.html',
})
export class UserFormComponent {
userForm: FormGroup;
constructor() {
// FormGroup তৈরির সময় FormControl এর সাথে ভ্যালিডেটর যুক্ত করা হচ্ছে।
this.userForm = new FormGroup({
name: new FormControl('', Validators.required),
email: new FormControl('', [Validators.required, Validators.email]),
age: new FormControl('', [Validators.required, Validators.min(18)]),
});
}
onSubmit() {
if (this.userForm.valid) {
console.log(this.userForm.value);
}
}
}
এখানে, userForm
একটি FormGroup
যা ৩টি FormControl
(name, email, এবং age) নিয়ে গঠিত। Validators
ব্যবহার করে ফিল্ডের জন্য ভ্যালিডেশন চেক করা হয়েছে।
FormControl হলো একটি একক ইনপুট কন্ট্রোল যা Angular ফর্মে ব্যবহারকারী দ্বারা প্রদত্ত মান এবং তার স্টেট (যেমন, প্রিসেট মান, ডির্টি, প্রিস্টিন, টাচড, আনটাচড ইত্যাদি) সুরক্ষিত করে। এটি একটি সিঙ্গেল ভ্যালু ধারণ করে এবং সাধারণত FormGroup এর ভিতরে ব্যবহার করা হয়।
import { Component } from '@angular/core';
import { FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-email-form',
templateUrl: './email-form.component.html',
})
export class EmailFormComponent {
emailControl: FormControl;
constructor() {
// FormControl ইনস্ট্যান্স তৈরি
this.emailControl = new FormControl('', [Validators.required, Validators.email]);
}
onSubmit() {
if (this.emailControl.valid) {
console.log(this.emailControl.value);
}
}
}
এখানে, emailControl
একটি FormControl
যা email ইনপুটের জন্য ব্যবহৃত হয়। ভ্যালিডেশন প্রয়োগ করা হয়েছে যাতে ইনপুটটি অবশ্যই একটি সঠিক ইমেইল ঠিকানা হয়।
FormControl
বা অন্য FormGroup
এর একটি গ্রুপ। এটি একটি ফর্মের বিভিন্ন ক্ষেত্রকে একত্রিত করে এবং তাদের একটি ইউনিট হিসেবে পরিচালনা করতে সহায়ক হয়।আপনি FormGroup এর ডেটা অ্যাক্সেস করতে পারেন এবং সেটিকে পরিবর্তন করতে পারেন:
console.log(this.userForm.value); // এটি ফর্মের সব ভ্যালু দেখাবে।
this.userForm.controls['name'].setValue('John Doe');
এখানে, setValue
মেথড ব্যবহার করে FormControl
এর মান পরিবর্তন করা হয়েছে।
Angular Reactive Forms এ FormControl এবং FormGroup এর জন্য আপনি বিভিন্ন ধরনের ভ্যালিডেশন প্রয়োগ করতে পারেন:
new FormControl('', Validators.required);
new FormControl('', [Validators.required, Validators.email]);
import { AbstractControl, ValidationErrors } from '@angular/forms';
function forbiddenNameValidator(control: AbstractControl): ValidationErrors | null {
const forbidden = /admin/i.test(control.value);
return forbidden ? { forbiddenName: { value: control.value } } : null;
}
new FormControl('', [forbiddenNameValidator]);
এখানে, একটি কাস্টম ভ্যালিডেটর তৈরি করা হয়েছে যা "admin" শব্দটি ইনপুটে থাকলে সেটি অবৈধ হিসেবে চিহ্নিত করবে।
ফর্ম সাবমিট করার সময়, আপনি ফর্মের ভ্যালিডিটি চেক করে ডেটা প্রসেস করতে পারেন। নিচের কোডটি একটি সাধারণ উদাহরণ:
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<input formControlName="name" placeholder="Name">
<input formControlName="email" placeholder="Email">
<input formControlName="age" placeholder="Age">
<button type="submit" [disabled]="!userForm.valid">Submit</button>
</form>
এখানে, ngSubmit
ইভেন্ট ফর্ম সাবমিট হওয়ার পর onSubmit() মেথডটি কল করবে। [disabled]="!userForm.valid"
দিয়ে সাবমিট বাটনটি শুধুমাত্র ফর্মের ভ্যালিড হলে অ্যাকটিভ হবে।
FormGroup এবং FormControl Angular Reactive Forms-এ ফর্ম ডেটা এবং তার ভ্যালিডেশন পরিচালনা করতে ব্যবহৃত হয়। FormGroup একাধিক FormControl বা FormGroup এর একটি গ্রুপ হিসেবে কাজ করে, এবং FormControl একক ইনপুট ফিল্ডের মান এবং স্টেট পরিচালনা করে। এই দুটি ফিচার ফর্ম ম্যানেজমেন্টকে আরও সহজ এবং শক্তিশালী করে তোলে।
Angular-এ ফর্ম সাবমিশন হ্যান্ডলিং একটি গুরুত্বপূর্ণ প্রক্রিয়া, যেখানে ইউজার ইনপুট সংগ্রহ করে, যাচাই করা হয় এবং তারপর সার্ভারে পাঠানো হয়। Angular দুই ধরনের ফর্ম হ্যান্ডলিং সমর্থন করে:
এখানে আমরা দুইটি পদ্ধতির মধ্যে ফর্ম সাবমিশন হ্যান্ডলিং সম্পর্কে বিস্তারিত আলোচনা করব।
Template-driven forms হলো একটি সরল পদ্ধতি যেখানে ফর্মের লজিক এবং কন্ট্রোলের অধিকাংশ অংশ টেম্পলেটের মধ্যেই থাকে। এতে কম কোড লাগে, এবং এটি ছোট বা সহজ ফর্মের জন্য উপযুক্ত।
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
<form (ngSubmit)="onSubmit()" #userForm="ngForm">
<label for="name">Name:</label>
<input type="text" id="name" name="name" ngModel required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" ngModel required>
<button type="submit" [disabled]="!userForm.form.valid">Submit</button>
</form>
এখানে:
ngSubmit
ডিরেক্টিভ ব্যবহার করা হয়েছে ফর্ম সাবমিশনের জন্য।ngModel
ব্যবহার করে ফর্ম ইনপুটের মধ্যে ডেটা বাইন্ডিং করা হচ্ছে।required
ভ্যালিডেশন দেওয়া হয়েছে ইনপুট ফিল্ডে।import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
onSubmit() {
alert('Form submitted!');
}
}
এখানে, onSubmit()
মেথডটি ফর্মের ডেটা প্রসেস করতে বা সাবমিট করতে ব্যবহৃত হয়।
Reactive forms হলো আরও শক্তিশালী এবং ফর্ম লজিকের উপর পূর্ণ নিয়ন্ত্রণ প্রদান করে। এই পদ্ধতিতে ফর্ম কন্ট্রোল এবং ফর্ম গ্রুপগুলো প্রোগ্রামেটিকভাবে কম্পোনেন্টে তৈরি করা হয়, যা বড় এবং জটিল ফর্মের জন্য উপযুক্ত।
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule, ReactiveFormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
userForm: FormGroup;
constructor(private fb: FormBuilder) {
this.userForm = this.fb.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]]
});
}
onSubmit() {
if (this.userForm.valid) {
console.log(this.userForm.value);
alert('Form submitted successfully!');
} else {
alert('Please fill out all fields correctly.');
}
}
}
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<label for="name">Name:</label>
<input type="text" id="name" formControlName="name">
<label for="email">Email:</label>
<input type="email" id="email" formControlName="email">
<button type="submit" [disabled]="!userForm.valid">Submit</button>
</form>
এখানে:
FormGroup
এবং FormControl
ব্যবহার করে ফর্ম কন্ট্রোল তৈরি করা হয়েছে।formControlName
ডিরেক্টিভ ব্যবহার করে ফর্ম ইনপুটের সাথে কন্ট্রোল যুক্ত করা হয়েছে।userForm.valid
)।Angular-এ ফর্ম সাবমিশন হ্যান্ডলিং দুটি প্রধান পদ্ধতিতে করা যায়: Template-driven forms এবং Reactive forms। Template-driven forms সহজ ও ছোট ফর্মের জন্য উপযুক্ত, যেখানে Reactive forms বড় ও জটিল ফর্মের জন্য বেশি কার্যকর। উভয় পদ্ধতিতে ফর্মের ডেটা ভ্যালিডেশন এবং সাবমিশন হ্যান্ডলিং খুবই সহজ এবং কার্যকর।
Read more