Я пытаюсь отправить результат 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
запускается пользователями, нажимающими на карту.
Получение данных с сервера и передача их компонентам работает: я могу выводить полезные данные на консоль в каждом компоненте. Однако шаблоны компонентов не обновляются.
После поиска в Google и возни большую часть сегодняшнего дня я обнаружил, что эта реализация не запускает обнаружение изменений Angular. Исправление состоит в том, чтобы либо
- обернуть мой звонок
next()
в службуNgZone.run(() => { this.response.next(resp); }
- вызовите
ApplicationRef.tick()
послеthis.title = resp['title']
в компоненте.
Оба решения кажутся грязными хаками для такого тривиального варианта использования. Должен быть лучший способ добиться этого.
Поэтому мой вопрос: как правильно получить данные один раз и отправить их нескольким компонентам?
Кроме того, я хотел бы понять, почему моя реализация ускользает от системы обнаружения изменений Angular.
EDIT оказывается, я инициировал свой вызов HttpClient
за пределами зоны Angular, поэтому он не смог обнаружить мои изменения, см. мой ответ для получения более подробной информации.