Introduction to Angular Services

  • By Pooja Ghodekar
  • August 26, 2024
  • Angular
Introduction to Angular Services

Introduction to Angular Services

Discover the Introduction to Angular Services and learn how to manage data, share logic across components, and improve your Angular application’s efficiency.

 

1. What are Angular Services? 

Angular services are objects or functions that perform specific tasks, often independent of any single view or component. They provide a way to encapsulate shared logic, data, or functionality that can be used by multiple components, making your code more modular, maintainable, and testable. 

 

2. Core Concepts of Services 

Separation of Concerns: By using services, you can separate the business logic from the presentation logic (components). Components handle user interaction, while services handle data processing,  making your application easier to manage and test. 

Dependency Injection (DI):. It allows you to inject services into components or other services. Angular’s DI system is central to how services work. This promotes loose coupling, where components don’t need to know how a service is implemented, just how to use it. 

 

3. Types of Services 

Singleton Services: When you provide a service at the root level (provided: ‘root’), Angular creates a single instance of the service for the entire application. This is useful for managing global state, such as user authentication status or application-wide settings. 

Scoped Services: You can provide services in a specific module or component, creating a new instance for each provider. This is useful for services that should not share state across different parts of the  application. 

Lazy-loaded Services: When you provide a service in a lazy-loaded module, Angular creates an instance of the service only when that module is loaded. This is useful for reducing initial load times and memory usage in large applications. 

Note: Prepare for your next interview with top Angular Interview Questions and Answers. Master key concepts, and best practices, and boost your confidence.

 

4. Creating and Using a Service 

Here’s a more detailed breakdown of how to create and use a service: 

Service Creation:

ng generate service myService 

This command generates two files: 

my-service.service.ts: Contains the service logic. 

Injectable Decorator: The @Injectable() decorator is used to define a class as a service and specify how  it should be provided. 

import { Injectable } from ‘@angular/core’; 

@Injectable({ 

 providedIn: ‘root’, // Makes this service a singleton across the app 

}) 

export class MyService { 

 constructor() { } 

 myMethod() { 

 console.log(‘Service method called’); 

 } 

Injecting the Service: You inject the service into a component by including it in the constructor: 

import { Component } from ‘@angular/core’; 

import { MyService } from ‘./my-service.service’; 

@Component({ 

 selector: ‘app-my-component’,

 templateUrl: ‘./my-component.component.html’, 

}) 

export class MyComponent { 

 constructor(private myService: MyService) { 

 this.myService.myMethod(); // Calls the service method 

 } 

 

For Free Demo classes Call: 020-71173125

Registration Link: Angular Course in Pune!

 

5. Advanced Service Patterns 

Using Observables with Services: This is common when working with data from HTTP requests or other asynchronous sources. Services often use observables to provide data to components asynchronously.  

import { Injectable } from ‘@angular/core’; 

import { HttpClient } from ‘@angular/common/http’; 

import { Observable } from ‘rxjs’; 

@Injectable({ 

 providedIn: ‘root’, 

}) 

export class DataService { 

 private apiUrl = ‘https://api.example.com/data‘; 

 constructor(private http: HttpClient) {} 

 getData(): Observable<any> { 

 return this.http.get(this.apiUrl); 

 } 

In the component, you subscribe to the observable to receive the data:

import { Component, OnInit } from ‘@angular/core’; 

import { DataService } from ‘./data.service’; 

@Component({ 

 selector: ‘app-data’, 

 template: `<div *ngIf=”data”>{{ data }}</div>`, 

}) 

export class DataComponent implements OnInit { 

 data: any; 

 constructor(private dataService: DataService) {} 

 ngOnInit(): void { 

 this.dataService.getData().subscribe(response => { 

 this.data = response; 

 }); 

 } 

Shared Services for State Management: Services can also be used to manage shared state between components. This is often done by creating a service that maintains an internal state and exposes it via observables. 

import { Injectable } from ‘@angular/core’; 

import { BehaviorSubject } from ‘rxjs’; 

@Injectable({ 

 providedIn: ‘root’, 

}) 

export class StateService {

 private stateSource = new BehaviorSubject<string>(‘initial state’); 

 currentState = this.stateSource.asObservable(); 

 updateState(newState: string) { 

 this.stateSource.next(newState); 

 } 

Components can then subscribe to this state: 

import { Component, OnInit } from ‘@angular/core’; 

import { StateService } from ‘./state.service’; 

@Component({ 

 selector: ‘app-state’, 

 template: `<div>{{ state }}</div>`, 

}) 

export class StateComponent implements OnInit { 

 state: string; 

 constructor(private stateService: StateService) {} 

 ngOnInit(): void { 

 this.stateService.currentState.subscribe(state => this.state = state); 

 } 

Service Hierarchies: You can create a hierarchy of services where a service depends on another service.  import { Injectable } from ‘@angular/core’; 

@Injectable({

 providedIn: ‘root’, 

}) 

export class LoggerService { 

 log(message: string) { 

 console.log(message); 

 } 

@Injectable({ 

 providedIn: ‘root’, 

}) 

export class UserService { 

 constructor(private logger: LoggerService) {} 

 getUser() { 

 this.logger.log(‘Fetching user…’); 

 // Logic to fetch user 

 } 

 

6. Best Practices for Angular Services 

Single Responsibility Principle: Each service must have a single responsibility. If a service is handling multiple unrelated tasks, consider breaking it into multiple services. 

Lazy Loading: Use lazy-loaded services for features that are not needed immediately.  

Use Interfaces: Define interfaces for the data models your services handle. This improves type safety and code readability. 

Handle Errors Gracefully: Always handle errors when making HTTP requests or performing asynchronous operations in your services. This can be done using operators like catchError in RxJS.

Avoid Side Effects: Services should be designed to avoid side effects, making them easier to test and reason about.

 

7. Use Cases for Angular Services 

Data Fetching: Fetching data from a backend API and providing it to components. 

State Management: Managing the state of an application or feature (e.g., user authentication,  shopping cart). 

Shared Logic: Encapsulating shared logic that needs to be used by multiple components or modules. 

Utility Functions: Providing utility functions that are used throughout the application (e.g., logging,  error handling). 

Cross-cutting Concerns: Managing concerns like caching, authentication, and authorization. 

 

Conclusion 

Angular services are a powerful tool for organizing and maintaining the logic and data of your application. By encapsulating functionality in services and leveraging Angular’s dependency injection system, you can create modular, reusable, and easily testable code.

 

Do visit our channel to know more: Click Here

Author:-

Pooja Ghodekar

Call the Trainer and Book your free demo Class For Angular Call now!!!
| SevenMentor Pvt Ltd.

© Copyright 2021 | SevenMentor Pvt Ltd.

 

Submit Comment

Your email address will not be published. Required fields are marked *

*
*