Обнаружение угловых изменений не срабатывает на Router.navigate()
У меня есть компонент в Angular называется NewEventComponent
который содержит только форму для отправки нового события. В методе отправки есть такой код:
onSubmit() {
this.isSendingRequest = true;
this.geolocationService.geocodeAddress(this.location.value).subscribe(
(results: google.maps.GeocoderResult[]) => {
if (results && results.length) {
const eventData: EventData = {
name: this.name.value,
location: [results[0].geometry.location.lat(), results[0].geometry.location.lng()],
startDate: this.datetimeService.convertDateAndTimeToISOString(this.startDate.value, this.startTime.value),
endingDate: this.datetimeService.convertDateAndTimeToISOString(this.endingDate.value, this.endingTime.value),
description: this.description.value,
sport: this.sport.value,
intensity: this.intensity.value,
fee: this.fee.value,
maxPlayers: this.maxPlayers.value
};
this.eventService.createEvent(eventData).subscribe(
(res: any) => {
this.alertService.createAlert({ message: EVENT_CREATED_MESSAGE, type: AlertType.Success });
this.router.navigate(['events', res.data.event.id]);
}
);
} else {
this.handleInvalidLocationError();
}
}
);
}
Он только отправляет событие на сервер и перенаправляет на страницу события, которая является EventDetails
составная часть. Этот компонент только запрашивает запрошенное событие на сервере и передает его как входные данные дочернему компоненту. Это код:
TS:
@Component({
selector: 'app-event-details',
templateUrl: './event-details.component.html',
styleUrls: ['./event-details.component.scss']
})
export class EventDetailsComponent implements OnInit {
private event: EventResponse;
constructor(
private activatedRoute: ActivatedRoute,
private eventService: EventService
) { }
ngOnInit() {
this.getEvent();
}
getEvent(): void {
this.activatedRoute.params.subscribe(
(params: Params) => {
this.eventService.getEvent(params.id).subscribe(
(res: any) => {
this.event = res.data.event;
}
);
}
);
}
}
HTML:
<div class="row">
<div class="col">
<div class="info-wrapper">
<app-event-details-info [event]="event">
</app-event-details-info>
</div>
</div>
</div>
И дочерний компонент EventDetailsInfo
только получает событие как Вход, как это @Input() event: EventResponse;
и отображает информацию в HTML, как это: <h5>{{ event?.name }}</h5>
,
Проблема здесь в том, что при навигации из NewEvent
компонент к EventDetails
Компонент, обнаружение изменений не срабатывает, поэтому, пока я не щелкну где-нибудь в DOM, например, изменения не отображаются. Но когда я перехожу к EventDetails
Компонент через URL-адрес непосредственно страницы отображается правильно.
Что мне не хватает при обнаружении изменений? Любая идея? Спасибо!
PS: EventService
только выполняет HTTP-вызовы и возвращает их как Observables, например:
createEvent(eventData: EventData): Observable<any> {
return this.http.post(`${environment.apiUrl}/events/`, eventData);
}
getEvent(eventId: string): Observable<any> {
return this.http.get(`${environment.apiUrl}/events/${eventId}`);
}
PS2: это GeolocationService
метод, используемый в методе "onSubmit()":
geocodeAddress(address: string): Observable<google.maps.GeocoderResult[]> {
const response: Subject<google.maps.GeocoderResult[]>
= new Subject<google.maps.GeocoderResult[]>();
const request: google.maps.GeocoderRequest = { address };
this.geocoder.geocode(request,
(results: google.maps.GeocoderResult[]) => {
response.next(results);
}
);
return response;
}
2 ответа
Обновить
onSubmit() {
this.isSendingRequest = true;
this.geolocationService.geocodeAddress(this.location.value).subscribe(
(results: google.maps.GeocoderResult[]) => {
this.zone.run(() => π
if (results && results.length) {
const eventData: EventData = {
name: this.name.value,
location: [results[0].geometry.location.lat(), results[0].geometry.location.lng()],
startDate: this.datetimeService.convertDateAndTimeToISOString(this.startDate.value, this.startTime.value),
endingDate: this.datetimeService.convertDateAndTimeToISOString(this.endingDate.value, this.endingTime.value),
description: this.description.value,
sport: this.sport.value,
intensity: this.intensity.value,
fee: this.fee.value,
maxPlayers: this.maxPlayers.value
};
this.eventService.createEvent(eventData).subscribe(
(res: any) => {
this.alertService.createAlert({ message: EVENT_CREATED_MESSAGE, type: AlertType.Success });
this.router.navigate(['events', res.data.event.id]);
}
);
} else {
this.handleInvalidLocationError();
}
}
});
);
}
оригинал
Возможно, событие выбрасывается за пределы угловой зоны.
Пытаться:
constructor(private zone: NgZone) { }
а также:
this.zone.run(() => this.router.navigate(['events', res.data.event.id]));
Если это решает проблему, вы должны исправить EventService
В зависимости от порядка, когда происходит подписка, вы можете полностью пропустить событие. Рассмотреть возможность использования shareReplay(1)
и разоблачение события.
Или переместите подписку на событие в конструктор:
constructor(
private activatedRoute: ActivatedRoute,
private eventService: EventService
) {
this.getEvent();
}
ngOnInit() {
}