У меня есть простой компонент, который использует сервис, возвращающий Observable.Такой Observable используется для управления созданием html-элемента через *ngIf
.
Здесь код
@Component({
selector: 'hello',
template: `<h1 *ngIf="stuff$ | async as obj">Hello {{obj.name}}!</h1>`,
styles: [`h1 { font-family: Lato; }`],
})
export class HelloComponent implements AfterViewInit {
constructor(
private myService: MyService,
) {}
stuff$;
ngAfterViewInit() {
this.stuff$ = this.myService.getStuff();
}
}
@Injectable({
providedIn: 'root'
})
export class MyService {
getStuff() {
const stuff = {name: 'I am an object'};
return of(stuff).pipe(delay(100));
}
}
Как видите, getStuff()
возвращает и Observable с delay
и все работает как положено.
Теперь я удаляю delay
и получаю следующую ошибку на консоли
Ошибка: ExpressionChangedAfterItHasBeenCheckedError: Выражение изменилось после его проверки.Предыдущее значение: 'ngIf: null'.Текущее значение: 'ngIf: [объект Object]'.
Это Stackbliz, который воспроизводит регистр.
Это неизбежно?Есть ли способ избежать этой ошибки?Этот небольшой пример повторяет пример реального мира, где MyService
запрашивает серверную часть, поэтому задержка.
Это актуально для меня, потому что я хотел бы иметь возможность синхронно запускать тесты, имитирующие реальный бэкэнд, и, когда я пробую такой подход, я получаю тот же результат.