В Angular есть функция, которая позволяет связывать между собой несвязанные компоненты. Это можно сделать с помощью сервисов и внедрения зависимостей.
Сервис в Angular - это объект, инкапсулирующий определенную функциональность или операцию. Он объявляется единожды и может быть использован в любой части приложения. Его главная цель - предоставить методы и свойства, которые могут быть использованы в нескольких местах.
Таким образом, если у вас есть две несвязанные компоненты, которые должны обмениваться данными или использовать общую функциональность, вы можете создать сервис и использовать его в этих компонентах.
Внедрение зависимостей (Dependency Injection, DI) в Angular - это технология, позволяющая созданию объекта с его зависимостями "из-за кулис". При внедрении зависимостей Angular ищет провайдера для каждой службы, запрашиваемой компонентом. Провайдер строкой ниже имя компонента указывает Angular, как создать службу.
Приведем пример использования сервиса для связи между двумя компонентами:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class DataService {
private messageSource = new Subject<string>();
currentMessage = this.messageSource.asObservable();
changeMessage(message: string) {
this.messageSource.next(message);
}
}
В этом коде создается сервис DataService
, который использует Subject из библиотеки rxjs
для хранения содержимого сообщения. Метод changeMessage
затем используется для изменения этого сообщения.
Этот сервис может быть вставлен в любой компонент с помощью внедрения зависимостей, и компоненты могут использовать метод changeMessage
для обмена данными даже если они не связаны напрямую.
Использование сервисов и внедрения зависимостей в Angular для связи между компонентами - более эффективный и организованный подход, чем поддержание глобального объекта состояния или испускание событий через несколько уровней компонентов. Инкапсулирование функциональности в сервисах также облегчает тестирование и повторное использование кода.