Вот пример:
@Component({
selector: 'my-app',
template: `
<div>
<h1>{{ foo }}</h1>
<bpp [(foo)]="foo"></bpp>
</div>
`,
})
export class App {
foo;
}
@Component({
selector: 'bpp',
template: `
<div>
<h2>{{ foo }}</h2>
</div>
`,
})
export class Bpp {
@Input('foo') foo;
@Output('fooChange') fooChange = new EventEmitter();
ngAfterViewInit() {
const potentiallyButNotNecessarilyAsyncObservable = Observable.of(null);
potentiallyButNotNecessarilyAsyncObservable.subscribe(() => {
this.fooChange.emit('foo');
})
}
}
где иногда появляется ошибка:
ExpressionChangedAfterItHasBeenCheckedError: выражение изменилось после проверки. Предыдущее значение: «не определено». Текущее значение: 'foo'
Это происходит из-за того, что двусторонняя привязка обновляется наблюдаемой, которая может получить значение на одном и том же тике. Я бы предпочел не оборачивать приведенную выше логику в setTimeout
, потому что это выглядит как хак и усложняет поток управления.
Что можно сделать, чтобы избежать этой ошибки здесь?
Имеет ли ошибка ExpressionChangedAfterItHasBeenCheckedError
вредные последствия или ее можно игнорировать? Если может, может ли датчик смены на нем молчать и не загрязнять консоль?