Services in Angular are reusable pieces of code that handle data fetching, business logic, or state management that multiple components or other services need to access.
## Creating a Service
You can generate a service using the Angular CLI:
```bash
ng generate service my-data
```
Or you can manually create a TypeScript class and decorate it with `@Injectable()`.
```ts
import {Injectable} from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class BasicDataStore {
private data: string[] = [];
addData(item: string): void {
this.data.push(item);
}
getData(): string[] {
return [...this.data];
}
}
```
### The `providedIn: 'root'` Option
Using `providedIn: 'root'` is the recommended approach for most services. It tells Angular to:
- **Create a single instance (singleton)** for the entire application.
- **Make it available everywhere** automatically, without needing to list it in any `providers` array.
- **Enable tree-shaking**, meaning the service is only included in the final JavaScript bundle if it is actually injected somewhere.
## Injecting a Service
Once a service is created, you can inject it into components, directives, or other services using the `inject()` function.
### Injecting into a Component
```ts
import {Component, inject} from '@angular/core';
import {BasicDataStore} from './basic-data-store.service';
While `providedIn: 'root'` covers most scenarios, you may sometimes need:
- **Component-specific instances**: If a component needs its own isolated instance of a service, provide it directly in the component's `@Component({ providers: [MyService] })` array.
- **Factory providers**: For dynamic creation.
- **Value providers**: For injecting configuration objects.