Я пытаюсь отправить результат HttpClient
post
запросов нескольких компонентов в моем приложении Angular. Я использую Subject
и вызываю его метод next()
всякий раз, когда новый запрос post
успешно выполняется. Каждый компонент подписывается на услугу Subject
.
Неисправные службы определены как
@Injectable()
export class BuildingDataService {
public response: Subject<object> = new Subject<object>();
constructor (private http: HttpClient) { }
fetchBuildingData(location) {
...
this.http.post(url, location, httpOptions).subscribe(resp => {
this.response.next(resp);
});
}
Компоненты подписываются на BuildingService.response
следующим образом
@Component({
template: "<h1>{{buildingName}}</h1>"
...
})
export class SidepanelComponent implements OnInit {
buildingName: string;
constructor(private buildingDataService: BuildingDataService) { }
ngOnInit() {
this.buildingDataService.response.subscribe(resp => {
this.buildingName = resp['buildingName'];
});
}
updateBuildingInfo(location) {
this.buildingDataService.fetchBuildingData(location);
}
}
updateBuildingInfo
вызывается пользователями, нажимающими на карту.
Получение данных с сервера и их передача компонентам работает: я могу выводить полезные данные на консоль каждого компонента. Однако шаблоны компонентов не обновляются.
После поисков и поисков в течение большей части сегодняшнего дня я обнаружил, что эта реализация не запускает обнаружение изменений Angular. Исправление - либо
- заверните мой звонок на
next()
в сервисе в NgZone.run(() => { this.response.next(resp); }
- вызов
ApplicationRef.tick()
после this.title = resp['title']
в компоненте.
Оба решения кажутся грязными взломами для такого тривиального варианта использования. Должен быть лучший способ добиться этого.
Поэтому мой вопрос: как правильно выбрать данные один раз и отправить их нескольким компонентам?
Кроме того, мне хотелось бы понять, почему моя реализация избегает системы обнаружения изменений Angular.
РЕДАКТИРОВАТЬ оказывается, что я инициировал свой звонок на HttpClient
за пределами зоны Angular, следовательно, он не мог обнаружить мои изменения, см. Мой ответ для более подробной информации.