DNext Angular Validator Library¶
A comprehensive validation library for Angular applications providing custom validators and validation services.
Installation¶
Setup¶
Import the validator service in your Angular module:
import { NgModule } from '@angular/core';
import { Validator } from '@dnext-angular/validator';
@NgModule({
providers: [
Validator
]
})
export class AppModule { }
Available Validators¶
1. Email Format Validator¶
Validates email addresses against standard format using RFC 5322 standards.
import { emailFormatValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
emailFormatValidator
]);
// Returns error { 'invalidEmail': true } if invalid
What it checks: - Proper email format ([email protected]) - Valid domain structure - Allowed special characters - Maximum length constraints
Error returned: { 'invalidEmail': true }
2. IP Format Validator¶
Validates IPv4 addresses ensuring proper formatting and range values.
import { ipFormatValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
ipFormatValidator
]);
// Returns error { 'invalidIp': true } if invalid
What it checks: - Four number segments - Each segment between 0-255 - Proper dot notation - No leading zeros
Error returned: { 'invalidIp': true }
3. Phone Number Validator¶
Validates international phone numbers following E.164 format.
import { phoneNumberValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
phoneNumberValidator
]);
// Returns error { 'invalidPhone': true } if invalid
What it checks: - Country code presence - Valid number length - Numeric values - Optional formatting characters (+, -, spaces)
Error returned: { 'invalidPhone': true }
4. Only Numbers Validator¶
Ensures input contains only numeric values without any other characters.
import { onlyNumbersShouldBeValidValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
onlyNumbersShouldBeValidValidator
]);
// Returns error { 'invalidNumber': true } if invalid
What it checks: - Only digits (0-9) - No special characters - No alphabetic characters - No spaces
Error returned: { 'invalidNumber': true }
5. No Leading/Trailing Spaces Validator¶
Prevents whitespace at the start or end of input while allowing spaces between words.
import { noLeadingTrailingSpacesValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
noLeadingTrailingSpacesValidator()
]);
// Returns error { 'noLeadingTrailingSpaces': true } if invalid
What it checks: - No spaces at start - No spaces at end - Allows internal spaces - Trims value comparison
Error returned: { 'noLeadingTrailingSpaces': true }
6. No Spaces Allowed Validator¶
Prevents any whitespace characters in the input.
import { noSpacesAllowedValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
noSpacesAllowedValidator()
]);
// Returns error { 'noSpacesAllowed': true } if invalid
What it checks: - No spaces anywhere - No tabs - No line breaks - No whitespace characters
Error returned: { 'noSpacesAllowed': true }
7. Non-Negative Integer Validator¶
Ensures input is a positive whole number or zero.
import { nonNegativeIntegerValidator } from '@dnext-angular/validator';
const control = new FormControl('', [
nonNegativeIntegerValidator
]);
// Returns error { 'nonNegativeInteger': true } if invalid
What it checks: - Only whole numbers - No negative values - No decimals - No special characters
Error returned: { 'nonNegativeInteger': true }
Implementation Examples¶
1. Basic Form Validation¶
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import {
emailFormatValidator,
phoneNumberValidator,
ipFormatValidator
} from '@dnext-angular/validator';
@Component({
selector: 'app-user-form',
template: `
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<div>
<label>Email:</label>
<input formControlName="email" type="email">
<div *ngIf="userForm.get('email')?.errors?.['invalidEmail']">
Please enter a valid email address
</div>
</div>
<div>
<label>Phone:</label>
<input formControlName="phone" type="tel">
<div *ngIf="userForm.get('phone')?.errors?.['invalidPhone']">
Please enter a valid phone number
</div>
</div>
<div>
<label>IP Address:</label>
<input formControlName="ipAddress">
<div *ngIf="userForm.get('ipAddress')?.errors?.['invalidIp']">
Please enter a valid IP address
</div>
</div>
<button type="submit" [disabled]="!userForm.valid">Submit</button>
</form>
`
})
export class UserFormComponent {
userForm: FormGroup;
constructor(private fb: FormBuilder) {
this.userForm = this.fb.group({
email: ['', [Validators.required, emailFormatValidator]],
phone: ['', [phoneNumberValidator]],
ipAddress: ['', [ipFormatValidator]]
});
}
onSubmit() {
if (this.userForm.valid) {
console.log(this.userForm.value);
}
}
}
2. Using Validator Service¶
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { Validator } from '@dnext-angular/validator';
@Component({
selector: 'app-service-form',
template: `
<form [formGroup]="serviceForm" (ngSubmit)="onSubmit()">
<div>
<label>Username:</label>
<input formControlName="username">
<div *ngIf="serviceForm.get('username')?.errors?.['noSpacesAllowed']">
Spaces are not allowed in username
</div>
</div>
<div>
<label>Description:</label>
<input formControlName="description">
<div *ngIf="serviceForm.get('description')?.errors?.['noLeadingTrailingSpaces']">
Remove leading or trailing spaces
</div>
</div>
<button type="submit" [disabled]="!serviceForm.valid">Submit</button>
</form>
`
})
export class ServiceFormComponent {
serviceForm: FormGroup;
constructor(
private fb: FormBuilder,
private validator: Validator
) {
this.serviceForm = this.fb.group({
username: ['', [this.validator.noSpacesAllowedValidator()]],
description: ['', [this.validator.noLeadingTrailingSpacesValidator()]]
});
}
onSubmit() {
if (this.serviceForm.valid) {
console.log(this.serviceForm.value);
}
}
}
3. Custom Error Messages Component¶
import { Component, Input } from '@angular/core';
import { AbstractControl } from '@angular/forms';
@Component({
selector: 'app-validation-errors',
template: `
<div class="error-messages" *ngIf="control?.errors && control?.touched">
<div *ngIf="control?.errors?.['invalidEmail']">
Please enter a valid email address
</div>
<div *ngIf="control?.errors?.['invalidPhone']">
Please enter a valid phone number
</div>
<div *ngIf="control?.errors?.['invalidIp']">
Please enter a valid IP address
</div>
<div *ngIf="control?.errors?.['noSpacesAllowed']">
Spaces are not allowed
</div>
<div *ngIf="control?.errors?.['nonNegativeInteger']">
Please enter a non-negative integer
</div>
</div>
`
})
export class ValidationErrorsComponent {
@Input() control: AbstractControl | null = null;
}
Dependencies¶
- @angular/core: >=18.0.1
- @angular/common: >=18.0.1
License¶
DNext PiAGroup
Validator Methods Explained¶
1. Email Format Validator¶
Validates email addresses against standard format using RFC 5322 standards.
import { emailFormatValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [emailFormatValidator]);
What it checks: - Proper email format ([email protected]) - Valid domain structure - Allowed special characters - Maximum length constraints
Error returned: { 'invalidEmail': true }
2. IP Format Validator¶
Validates IPv4 addresses ensuring proper formatting and range values.
import { ipFormatValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [ipFormatValidator]);
What it checks: - Four number segments - Each segment between 0-255 - Proper dot notation - No leading zeros
Error returned: { 'invalidIp': true }
3. Phone Number Validator¶
Validates international phone numbers following E.164 format.
import { phoneNumberValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [phoneNumberValidator]);
What it checks: - Country code presence - Valid number length - Numeric values - Optional formatting characters (+, -, spaces)
Error returned: { 'invalidPhone': true }
4. Only Numbers Validator¶
Ensures input contains only numeric values without any other characters.
import { onlyNumbersShouldBeValidValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [onlyNumbersShouldBeValidValidator]);
What it checks: - Only digits (0-9) - No special characters - No alphabetic characters - No spaces
Error returned: { 'invalidNumber': true }
5. No Leading/Trailing Spaces Validator¶
Prevents whitespace at the start or end of input while allowing spaces between words.
import { noLeadingTrailingSpacesValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [noLeadingTrailingSpacesValidator()]);
What it checks: - No spaces at start - No spaces at end - Allows internal spaces - Trims value comparison
Error returned: { 'noLeadingTrailingSpaces': true }
6. No Spaces Allowed Validator¶
Prevents any whitespace characters in the input.
import { noSpacesAllowedValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [noSpacesAllowedValidator()]);
What it checks: - No spaces anywhere - No tabs - No line breaks - No whitespace characters
Error returned: { 'noSpacesAllowed': true }
7. Non-Negative Integer Validator¶
Ensures input is a positive whole number or zero.
import { nonNegativeIntegerValidator } from '@dnext-angular/validator';
// Usage
const control = new FormControl('', [nonNegativeIntegerValidator]);
What it checks: - Only whole numbers - No negative values - No decimals - No special characters
Error returned: { 'nonNegativeInteger': true }
Advanced Usage Examples¶
Combining Multiple Validators¶
import { FormBuilder, Validators } from '@angular/forms';
import {
emailFormatValidator,
noSpacesAllowedValidator
} from '@dnext-angular/validator';
// Example of combining validators
const form = this.fb.group({
email: ['', [
Validators.required,
emailFormatValidator,
noSpacesAllowedValidator()
]]
});
Custom Error Messages¶
// Error message service
@Injectable({
providedIn: 'root'
})
export class ValidationMessageService {
getErrorMessage(control: AbstractControl): string {
if (control.errors) {
if (control.errors['invalidEmail']) {
return 'Please enter a valid email address';
}
if (control.errors['invalidPhone']) {
return 'Please enter a valid phone number';
}
// ... other error messages
}
return '';
}
}
Async Validation Example¶
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, AsyncValidatorFn } from '@angular/forms';
import { Validator } from '@dnext-angular/validator';
@Component({
selector: 'app-async-validation',
template: `
<form [formGroup]="form">
<input formControlName="email">
<div *ngIf="form.get('email')?.errors?.['emailTaken']">
This email is already taken
</div>
</form>
`
})
export class AsyncValidationComponent {
form: FormGroup;
constructor(
private fb: FormBuilder,
private validator: Validator
) {
this.form = this.fb.group({
email: ['', {
validators: [emailFormatValidator],
asyncValidators: [this.validator.emailExistsValidator()]
}]
});
}
}
Best Practices¶
1. Form Validation Strategy¶
- Use reactive forms for complex validation scenarios
- Combine synchronous and asynchronous validators when needed
- Implement proper error handling and display
- Consider user experience when showing validation messages
2. Performance Considerations¶
- Use debounceTime for async validators
- Avoid unnecessary validation triggers
- Cache validation results when possible
- Consider using OnPush change detection
3. Error Handling¶
- Provide clear, user-friendly error messages
- Show validation errors at appropriate times
- Consider accessibility in error presentation
- Implement proper error state styling