Используйте services
для обмена данными
Angular отличает компоненты от сервисов для повышения модульности и возможности повторного использования.
and It's Good Practice to Delegate complex component logic to services
С Angular Style Guide
Ограничивать логику в компоненте только
что требуется для просмотра. Вся остальная логика должна быть делегирована
услуги.
Переместите многократно используемую логику в сервисы и сделайте компоненты простыми и
сосредоточены на их назначении.
Почему? Логика может быть многократно использована несколькими компонентами, если
обслуживать и выставлять через функцию.
Почему? Логика в сервисе легче изолировать в модульном тесте,
в то время как логика вызова в компоненте может быть легко смоделирована.
Почему? Удаляет зависимости и скрывает детали реализации из
компонент.
Почему? Делает компонент тонким, аккуратным и сфокусированным.
Если ваша цель состоит в многоадресной передаче данных, используйте RXJS Subject
или BehaviorSubject
Subject
действует как мост / прокси между источником Observable
и многими observers
, позволяя нескольким observers
совместно использовать одно и то же Observable
исполнение.
Преимущества BehaviorSubject
над Subject
- Всегда будет возвращать текущее значение при подписке - звонить не нужно
onnext().
- Имеет функцию
getValue()
для извлечения последнего значения в виде необработанных данных.
- Это гарантирует, что компонент всегда получает самые последние данные.
- Вы можете получить наблюдаемое от субъекта поведения, используя
asobservable()
метод на BehaviorSubject
.
Subject vs BehaviorSubject
Услуги
private firstResponse=new BehaviorSubject<any>('');
private secondResponse=new BehaviorSubject<any>('');
CurrentDatafirst = this.firstResponse.asObservable();
CurrentDatasecond = this.secondResponse.asObservable();
getdata(){
forkJoin([playerObservable, worldObservable])
.subscribe(([player, world]) => {
this.firstResponse.next(player),
this.secondResponse.next(world)
})
});
}
Component1:
ngOnInit()
{
this.service.CurrentDatafirst.subscribe(//value=>your logic);
this.service.CurrentDatasecond.subscribe(//value=>your logic)
}
Component2:
ngOnInit()
{
this.service.CurrentDatafirst.subscribe(//value=>your logic);
this.service.CurrentDatasecond.subscribe(//value=>your logic)
}
RxJS Subjects for human beings
BehaviorSubject in Angular
Live Demo
-------------------------------------------- -----------------------------------------
Вы также можете отправить один запрос http
для нескольких наблюдателей с помощью оператора shareReplay
и принять соответствующие меры.
Вы должны знать, что http
возвращает наблюдаемую холодность и
Когда холодный observable
имеет кратное subscribers
, весь поток данных повторно отправляется для каждого subscriber
. Каждый подписчик становится независимым и получает собственный поток данных
Чтобы избежать дублирования HTTP-запросов shareReplay
Используется оператор.
Сервис
public response$:Observable<any>
getdata(){
forkJoin([playerObservable, worldObservable]).pipe(sharReplay(1));
}
fetchdata()
{
this.response$;
}
Component1:
ngOnInit()
{
this.service.fetchdata().subscribe(//value=>your logic);
}
Component2:
ngOnInit()
{
this.service.fetchdata().subscribe(//value=>your logic);
}
Live Demo