У меня есть компонент, который использует службу для отправки некоторых данных.
Этот компонент использует ChangeDetectionStrategy.OnPush
, но происходит нечто странное:
Когда запрос успешно : next
обратный вызов вызывается, formStatus
изменяется на «успех» и интерфейс обновляется с этим изменением.
Когда запрос терпит неудачу , error
вызывается обратный вызов, formStatus
изменяется на 'ошибку', но интерфейс не обновляет sh с этим изменением.
Как я понимаю, интерфейс не должен обновлять sh, потому что я использую ChangeDetectionStrategy.OnPush
, и я изменяю строковую переменную типа basi c.
Итак, почему обнаружение изменений инициируется в next
?
Компонент
Когда в сервисе происходит какая-либо ошибка, я хочу получить ее в сообщении об ошибке.
submit() {
this.formStatus = 'sending';
this._service.create(data).subscribe({
next: () => {
this.formStatus = 'success';
// interface refreshes
},
error: () => {
this.formStatus = 'error';
// interface does not refresh
console.log(this.formStatus); // prints 'error'
},
});
}
<div *ngIf="formStatus === 'success'">
...
</div>
Сервис
Делает вызов API и ловит ошибку, используя errorUtil.handle
, который выдает ошибку rx js (потому что я хочу вернуть Observable.error ).
create(requestData: Data): Observable<Data> {
return this._http
.post<HttpResponse<CreateResponse>>(
MY_API.createUrl,
JSON.stringify(requestData)
)
.pipe(
catchError(this._errorUtil.handle()),
map(data => this.onSuccessCreate(requestData, data))
);
}
Обработчик ошибок
handle<T>(): (error: HttpErrorResponse, caught?: Observable<T>) => Observable<T> {
return (error: HttpErrorResponse, caught?: Observable<T>) => {
return throwError();
};
}
Я пытался изменить return throwError();
на throw throwError();
, но поведение такое же.