Angular наблюдаемый при ошибке не обновляет sh интерфейс с ChangeDetectionStrategy.OnPush - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть компонент, который использует службу для отправки некоторых данных.

Этот компонент использует 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();, но поведение такое же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...