Почему HTML не обновляется после выполнения HTTP-запроса get? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть поле поиска, которое получает значение для поиска и заполняет массив.Если значение, предоставленное пользователем, недопустимо, логическое значение установлено на true, при этом отображается сообщение об ошибке, а цвет контура входа изменяется на красный.

У меня есть функция, которая получает указанное значение и заставляет HTTP получитьзапрос.Внутри функции .subscribe() я обновляю сообщение об ошибке и меняю цвет контура ввода на красный.

Я искал похожие проблемы и обнаружил, что в большинстве случаев люди не обновляли переменные внутри подписки, однакос моим кодом это не так.

MyComponent.component.ts

constructor(public rest: RestService) { }

private onCreateNewRequest(value: any) {
  let message = "Required!";
  if (value === undefined || value === "" || value.length < 0) {
    this.setErrorMessage(message);
    this.setIsFormInvalid(true);
    this.setNewRequestInputInvalid()
  } else {
    this.getOrderByNumber(this.setNewRequestInputInvalid, value);
  }
}

private getOrderByNumber(callback, value: string) {
  let message = "Invalid Order!";
  this.rest.getOrderByNumber(value).subscribe((orderNrData: {}) => {
    if (Object.entries(orderNrData).length !== 0) {
      this.onCreateReturn(orderNrData);
    } else {
      callback();
      this.setErrorMessage(message);
      this.setIsFormInvalid(true);
    }
  }, error => {
    callback();
    this.setErrorMessage(message);
    this.setIsFormInvalid(true);
  });
}

private setErrorMessage(message: string) {
  this.errorMessage = message;
}

private setIsFormInvalid(status: boolean) {
  this.isFormInvalid = status;
}

private setNewRequestInputInvalid() {
  document.getElementById('new-request-input-id').style['border-color'] = 'red';
}

MyComponent.component.html

<div class="row">
  <div class="col-2 d-flex align-items-center">Order: </div>
  <div class="col-8">
    <input class="form-control align-middle new-request-input-class" id="new-request-input-id" type="text" placeholder="Ex: EU030327" aria-label="Search" (input)="resetValidator()" (keyup.enter)="onCreateNewRequest(searchInput.value)" #searchInput>
  </div>
  <div class="col-2"></div>
</div>

<div class="row">
  <div class="col-2"></div>
  <div class="col-8 error-label-col" id="error-label-id" *ngIf="isFormInvalid">
    <small>{{getErrorMessage()}}</small>
  </div>
</div>

Rest.service.ts

private extractData(res: Response) {
  let body = res;
  return body || {};
}

getOrderByNumber(order_nr): Observable<any> {
  return this.http.get(endpoint + 'orders/number/' + order_nr, httpOptions).pipe(
            map(this.extractData));
} 

Мой код успешно меняет цвет контура ввода на красный, но почему-то не может изменить isFormInvalid на true.Из-за этого *ngIf не сработает и сообщение никогда не будет показано пользователю.

РЕДАКТИРОВАТЬ:

Если я использую ChangeDetectorRef после того, как яchange isFormInvalid все работает как положено ...

constructor(private ref: ChangeDetectorRef) { }

private getOrderByNumber(callback, value: string) {
  let message = "Invalid Order!";
  this.rest.getOrderByNumber(value).subscribe((orderNrData: {}) => {
    if (Object.entries(orderNrData).length !== 0) {
      this.onCreateReturn(orderNrData);
    } else {
      callback();
      this.setErrorMessage(message);
      this.setIsFormInvalid(true);
      this.ref.detectChanges(); // here
    }
  }, error => {
    callback();
    this.setErrorMessage(message);
    this.setIsFormInvalid(true);
    this.ref.detectChanges(); // here
  });
}

Почему Angular обнаруживает эти изменения, только если я заставляю их обнаруживать?Кроме того, это хорошая практика?

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