Подтвердить что ты не робот

Angular 2 Просмотр не будет обновляться после изменения переменной в подписке

У меня проблема, когда мое представление не изменится при обновлении моей переменной в моей наблюдаемой подписке. Я пытаюсь показать загрузчик загрузки, пока я жду ответа от моего бэкэнда, а затем отображу ответ, но счетчик не скроется. Моя подписка выглядит следующим образом:

this.isRequesting = "true";
this.questionService.onSubmit(form, this.questions).subscribe( (value) => {
        this._ngZone.run( () => {
             this.fileLocation = JSON.stringify(value);
             console.log(this.fileLocation);
            this.isRequesting = "false";
            console.log(this.isRequesting);
        });
    });

И мой html для этого компонента выглядит так:

<spinner *ngIf="isRequesting=='true'"></spinner>

Я вижу, что isRequesting изменяется на "false" на моей консоли после того, как я получаю ответ от бэкэнд (Springboot), но представление все равно не изменяется. Spinner был из SpinKit, и я изменил этот учебник чтобы мой счетчик работал.

Я пробовал:

  • Путь в учебнике (с stopRefreshing() в ошибке и полных параметрах наблюдаемого)
  • ngZone, чтобы заставить мое представление обновляться.

Есть ли у кого-нибудь идеи о том, как получить мое представление для обновления или каким-либо способом заставить прядильщика скрыться после получения ответа от моего бэкэнда?

4b9b3361

Ответ 1

Вы видите какую-либо ошибку на консоли? Это может быть связано с тем, что angular не запускает обнаружение изменений после того, как вы обновили значение. Я думаю, что вам не нужен ngZone.run как он будет запускать код за пределами угловой зоны.

this.questionService.onSubmit(form, this.questions).subscribe( (value) => {
            this.fileLocation = JSON.stringify(value);
            console.log(this.fileLocation);
            this.isRequesting = "false";
            console.log(this.isRequesting);
    });

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

  • просто оберните обновление isRequesting в установленное время ожидания

    setTimeout( () => this.isRequesting = "false", 0);
    
  • вызов обнаружения изменений вручную

    import {ChangeDetectorRef} from '@angular/core'
    constructor(private ref: ChangeDetectorRef){}
    
    this.questionService.onSubmit(form, this.questions).subscribe( (value)=> {
        //existing code
        console.log(this.isRequesting);
        this.ref.detectChanges();
    });
    

Ответ 2

Вы также можете попробовать это решение: Руководство от Thoughtram

Краткая версия:

 import { ChangeDetectorRef } from '@angular/core';
    ...
    constructor(private cd: ChangeDetectorRef) {}
    ...
    ... .subscribe( () => {
           <yourstuff>
           this.cd.markForCheck();
        }

и вы хороши.

Фон: при изменении значения через .subscribe() angular не уведомляет, что он должен выполнить changeetection. Поэтому вам нужно запустить его самостоятельно.

Ответ 3

если вы используете его в выражении * ngIf, помните * ngIf = false не будет работать как выражение, которое вам нужно добавить

 <ul *ngIf=" somefunction(x) ? false: true">