首先,请注意,只有在以开发人员模式运行应用程序时才会引发此异常(默认情况是beta-0起是这种情况):如果enableProdMode()
在引导应用程序时调用,则不会引发该异常(请参阅更新的代码)。
其次,不要这样做,因为有充分的理由抛出此异常:简而言之,在开发人员模式下,每轮变更检测之后都会立即进行第二轮,以验证自第一轮结束以来没有任何绑定发生更改,因为这将表明更改是由更改检测本身引起的。
在你的pl缩中 {{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
错误的一切都非常详细地解释了该行为。