Во-первых, обратите внимание, что это исключение будет сгенерировано только при запуске приложения в режиме разработки (что имеет место по умолчанию в бета-0): если вы вызываете enableProdMode()
при загрузке приложения, оно не будет выброшено ( см. обновленный план ).
Во-вторых, не делайте этого, потому что это исключение вызывается по уважительной причине: короче говоря, когда в режиме разработки, каждый раунд обнаружения изменений сопровождается сразу же вторым раундом, который проверяет, что с конца первого не изменились привязки, поскольку это указывает на то, что изменения вызваны самим обнаружением изменений.
В вашем соединении привязка {{message}}
изменяется вашим вызовом setMessage()
, что происходит в ngAfterViewInit
ловушке, которая происходит как часть начального хода обнаружения изменений. Это само по себе не является проблемой - проблема в том, что setMessage()
изменяет привязку, но не запускает новый раунд обнаружения изменений, а это означает, что это изменение не будет обнаружено, пока какой-то будущий раунд обнаружения изменений не будет запущен где-то еще.
Вывод: все, что изменяет привязку, должно инициировать раунд обнаружения изменений, когда это происходит.
Обновите в ответ на все запросы пример того, как это сделать : решение @ Tycho работает, как и три метода в ответе @MarkRajcok. Но, честно говоря, все они мне кажутся уродливыми и неправильными, вроде тех хаков, к которым мы привыкли опираться в ng1.
Конечно, есть случайные обстоятельства , при которых эти писаки подходящие, но если вы используете их на что - нибудь более чем очень эпизодически, это признак того, что вы сражаетесь рамки , а не полностью охватывает его реактивную природу.
ИМХО, более идиоматический, "Angular2 способ" подхода к этому - что-то вроде: ( plunk )
@Component({
selector: 'my-app',
template: `<div>I'm {{message | async}} </div>`
})
export class App {
message:Subject<string> = new BehaviorSubject('loading :(');
ngAfterViewInit() {
this.message.next('all done loading :)')
}
}
ExpressionChangedAfterItHasBeenCheckedError
ошибке, подробно объясняет поведение.