DEV Community

Simone Gentili
Simone Gentili

Posted on • Edited on

How to use observables with Angular

The example is trivial, very trivial, but it aims to just keep the observable parts and remove other stuffs. I did this post because I would like to read this whenever I started to work with angular few months ago.

src/app/app.component.ts

And now let see the app component of this trivial example. The app component want to log the username whenever the service's observable receive a form.

let subject = this.messenger.subject.subscribe((form:LoginForm) => { console.log(form.username) }) 
Enter fullscreen mode Exit fullscreen mode

The form data will be sent via a form like the following.

src/app/app.component.ts

Let see the complete component.

import { Component } from '@angular/core'; import { MessengerService } from './messenger.service'; import { LoginForm } from './login-form'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) export class AppComponent { constructor(private messenger : MessengerService) { this.messenger.subject.subscribe((form:LoginForm) => { console.log(form.username) }) } } 
Enter fullscreen mode Exit fullscreen mode

And then let me introduce the service.

src/app/messenger.service.ts

The service provide a public observable.

public subject: Subject<LoginForm> = new Subject; 
Enter fullscreen mode Exit fullscreen mode

and a method that send observable to the next observer, ...

send(form: LoginForm) { this.subject.next(form); } 
Enter fullscreen mode Exit fullscreen mode

And this.subject.next(form); notify to all observer the form content. Do you remember the app component?

subject.subscribe((form:LoginForm) => { console.log(form.username) }) 
Enter fullscreen mode Exit fullscreen mode

Below you can read the MessengerService complete.

import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { LoginForm } from './login-form'; @Injectable({ providedIn: 'root' }) export class MessengerService { public subject: Subject<LoginForm> = new Subject; constructor() { } send(form: LoginForm) { this.subject.next(form); } } 
Enter fullscreen mode Exit fullscreen mode

src/app/login-form/login-form.component.html

About this form we just need to see that it contains <input formControlName="username" name="username" />.

<form [formGroup]="customFormName (ngSubmit)="onSubmit(customFormName.value)"> <input formControlName="username" name="username" /> <button type="submit">go!!!</button> </form> 
Enter fullscreen mode Exit fullscreen mode

src/app/login-form/login-form.component.ts

Watching html you can see that send method is called after submit. Component's onSubmit method send data to the service ... messenger.send(data).

onSubmit(data) { messenger.send(data) this.clearForm(); } 
Enter fullscreen mode Exit fullscreen mode
import { Component, OnInit } from '@angular/core'; import { FormBuilder } from '@angular/forms'; import { MessengerService } from '../messenger.service'; @Component({ selector: 'app-login-form', templateUrl: './login-form.component.html', styleUrls: ['./login-form.component.scss'] }) export class LoginFormComponent implements OnInit { customFormName; constructor( private builder: FormBuilder, private messenger: MessengerService ) { this.clearForm(); } ngOnInit() { } onSubmit(data) { messenger.send(data) this.clearForm(); } private clearForm() { this.customFormName = this.builder.group({ username: '', }); } } 
Enter fullscreen mode Exit fullscreen mode

and thanks to the subscriber

subject.subscribe((form:LoginForm) => { console.log(form.username) }) 
Enter fullscreen mode Exit fullscreen mode

You'll can see the username in console whenever you'll type a username and click on go!!! button.

Top comments (0)