DEV Community

Cover image for Smooth Sailing with Angular Forms: A Beginner's Odyssey ⛵️
Abhishek Tiwari
Abhishek Tiwari

Posted on

8 4 2 2 1

Smooth Sailing with Angular Forms: A Beginner's Odyssey ⛵️

I Ahoy, brave sailors of the Angular seas! Are you ready to embark on an exciting journey into the world of forms? In this beginner-friendly tutorial, we'll guide you through the process of creating interactive forms using Angular's Template-Driven and Reactive Forms. By the end of this voyage, you'll be equipped with the knowledge and skills to build stunning and user-friendly forms in your Angular applications. So, let's raise the sails and set course for exploration!

Form Approach Advantages
Template-Driven Forms Easier setup for simple forms; Suitable for beginners; Less code for basic scenarios
Reactive Forms Flexible and ideal for complex forms; Precise control over form elements; Dynamic interactions

Setting Sail: Anchoring Your Project 🚀

To start our adventure, we need a solid foundation. Let's create a new Angular project and generate a component to serve as the centerpiece of our forms exploration:

ng new AngularFormsAdventure
cd AngularFormsAdventure
ng generate component form-adventure
Enter fullscreen mode Exit fullscreen mode

Navigating the Shores of Template-Driven Forms ⛵️

Imagine gliding through calm waters, guided by a trusty map. That's the feeling of using Angular's Template-Driven Forms – they simplify form creation by automatically synchronizing form controls with our template. Let's set up a basic form with three fields: name, email, and password.

form-adventure.component.html:

<form #form="ngForm" (ngSubmit)="submitForm(form)">
  <label>Name:</label>
  <input type="text" name="name" ngModel required>

  <label>Email:</label>
  <input type="email" name="email" ngModel required email>

  <label>Password:</label>
  <input type="password" name="password" ngModel required>

  <button type="submit">Set Sail</button>
</form>
Enter fullscreen mode Exit fullscreen mode

form-adventure.component.ts:

import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';

@Component({
  selector: 'app-form-adventure',
  templateUrl: './form-adventure.component.html',
  styleUrls: ['./form-adventure.component.css']
})
export class FormAdventureComponent {
  submitForm(form: NgForm) {
    if (form.valid) {
      console.log(form.value);
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Steadying the Ship with Reactive Forms 🌊

Reactive Forms provide a more flexible and robust way to handle forms in Angular. Think of it as steering a ship with precise control. Let's equip our vessel for this journey.

app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; // Don't forget to import FormsModule and ReactiveFormsModule

import { AppComponent } from './app.component';
import { FormAdventureComponent } from './form-adventure/form-adventure.component';

@NgModule({
  declarations: [
    AppComponent,
    FormAdventureComponent
  ],
  imports: [
    BrowserModule,
    FormsModule, // Add FormsModule here
    ReactiveFormsModule, // Add ReactiveFormsModule here for reactive form
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Enter fullscreen mode Exit fullscreen mode

form-adventure.component.ts:

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

@Component({
  // ...
})
export class FormAdventureComponent implements OnInit {
  form: FormGroup;

  constructor(private fb: FormBuilder) { }

  ngOnInit(): void {
    this.form = this.fb.group({
      name: ['', [Validators.required]],
      email: ['', [Validators.required, Validators.email]],
      password: ['', [Validators.required]],
    });
  }

  submitForm() {
    if (this.form.valid) {
      console.log(this.form.value);
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Setting Sail: Anchoring Your Project ⚓️

With our sails raised, it's time to navigate the waters of form submission. As the intrepid captain, you'll lead the way:

// form-adventure.component.ts
submitForm() {
  if (this.form.valid) {
    console.log(this.form.value);
  }
}
Enter fullscreen mode Exit fullscreen mode

Navigating the Storm: Handling Errors 🌦️

Every sailor faces rough seas, and in our case, these are errors in form fields. Angular offers an elegant way to handle these errors and display user-friendly messages.

form-adventure.component.html:

<!-- Inside the form -->
<label>Name:</label>
<input type="text" name="name" ngModel required>
<div *ngIf="form.controls['name'].hasError('required')" class="error">Name is required!</div>

<!-- Similar blocks for other fields -->
Enter fullscreen mode Exit fullscreen mode

Navigating Uncharted Waters: Custom Validation 🛡️

To ensure the security of our ship, we'll implement custom validation for the password field. This ensures that the password is strong and meets specific criteria.

form-adventure.component.ts:

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

function strongPasswordValidator(control: AbstractControl): { [key: string]: boolean } | null {
  const value: string = control.value;

  // Check if the password is strong
  if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})/.test(value)) {
    return { 'strongPassword': true };
  }

  return null;
}

@Component({
  // ...
})
export class FormAdventureComponent implements OnInit {
  // ... Existing code ...

  ngOnInit(): void {
    this.form = this.fb.group({
      // ... Existing fields ...
      password: ['', [Validators.required, strongPasswordValidator]],
    });
  }

  // ... Existing code ...
}
Enter fullscreen mode Exit fullscreen mode

Final Thoughts: Charting Your Angular Course 🗺️

Congratulations, intrepid explorer! With newfound knowledge of Angular's forms, you're ready to embark on your form-building quests. Every line of code is a step toward mastering forms, whether you choose Template-Driven or Reactive Forms. Embrace challenges, celebrate successes, and let your Angular journey be legendary! 🚢🌟 Set forth, fellow adventurer. May your code be bug-free, forms delightful, and your passion unquenchable. Smooth seas and clear skies await! 🌊⚡️

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more