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! 🌊⚡️

AWS GenAI LIVE image

Real challenges. Real solutions. Real talk.

From technical discussions to philosophical debates, AWS and AWS Partners examine the impact and evolution of gen AI.

Learn more

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post