먼저,이 예외는 개발자 모드에서 앱을 실행할 때만 발생합니다 (기본적으로 베타 0의 경우). enableProdMode()
앱을 부트 스트랩 할 때 호출 하면 발생하지 않습니다 ( 참조). 업데이트 된 plunk ).
둘째, 하지마 이 예외가 정당한 이유로 발생하기 때문에 . 즉, dev 모드에서는 모든 변경 라운드 감지 다음에 첫 번째 종료 이후 바인딩이 변경되지 않았 음을 확인하는 두 번째 라운드가 즉시 발생합니다. 변경 감지 자체로 인해 변경이 발생했음을 나타냅니다.
plunk에서을 {{message}}
호출 하면 바인딩 이 변경됩니다.이 변경 setMessage()
은 ngAfterViewInit
후크에서 발생하며 초기 변경 감지 회전의 일부로 발생합니다. 그 자체로는 문제가되지 않습니다. 문제는 setMessage()
바인딩 을 변경하지만 새로운 변경 라운드 감지를 트리거하지 않는다는 것입니다. 이는 향후 변경 라운드 감지가 다른 곳에서 트리거 될 때까지이 변경이 감지되지 않음을 의미합니다.
테이크 아웃 : 바인딩을 변경하는 것은 변경 감지를 트리거해야합니다 .
@MarkRajcok이 지적한 답변 의 세 가지 방법과 같이 @Tycho 의 솔루션이 작동하는 것처럼 모든 방법에 대한 예제 요청에 대한 응답으로 업데이트 하십시오 . 그러나 솔직히, 그들은 우리가 ng1에 기대 던 일종의 해킹과 같이 나에게 추악하고 잘못된 느낌을 느낍니다.
있다, 확실히 가끔 당신이보다 더 아무것도를 사용하는 경우 이러한 해킹이 적절한 상황,하지만 아주 가끔으로, 당신이 완전히의 반응 특성을 수용하기보다는 프레임 워크를 싸우고 있다는 신호입니다.
이것에 접근하는 더 관용적 인 "Angular2 방식"인 IMHO는 다음과 같은 라인입니다 : ( 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
기사 는 동작을 자세하게 설명합니다.