2017-02-09 5 views
1

私は奇妙な問題があります。私は数時間は解決できません。私のコンポーネントでngOnChanges()でAngular2のプライベート変数が更新されていません

は私が持っている:

@Input() content : string; 

private contentPreview : any; 

ngOnChanges(changes: SimpleChanges) { 
    this.contentPreview = changes['content'].currentValue; 
    console.log(changes['content'].currentValue); // <-- WORKS 
} 

変数this.contentPreviewは変更されません。私はそれを表示しようとすると、未定義のままです。私がthis.contentPreview = "X"を試しても、コンポーネント内の他の場所では定義されません。

何か不足していますか、それともバグですか?

+0

これは、おそらく、変更検出サイクルが既に終了していることが原因です。したがって、 'content'への単一の変更によってonChangesフックがトリガされ、contentPreview varが更新されますが、変更検出サイクルが終了するため、DOMはそれ以降更新されません。 – MikeOne

+0

おそらくdoCheckフックを使ってこれを解決できます。詳細はhttps://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#onchanges – MikeOne

+0

Mike、ありがとう!私はサイクルポイントを得る。しかし、別のイベントの後にプライベート変数を表示しようとしました(コンポーネントをクリックするなど)、値は保存されませんでした。どのように動作するはずですか? –

答えて

1

私は実際に問題を再現できませんでした。しかし、あなたがconsole.logが動作していると言っているので、NgZoneでアップデートを試して強制することができます。これは、フックが少なくとも呼び出されたことを意味しますが、何らかの理由でDOMを更新しないということです。だから、試してみてください。

あなたの子コンポーネントで:

import {NgZone} from '@angular/core' 

はコンストラクタでそれを注入:

constructor(private ngZone: NgZone) { } 

してからOnChangesに:

ngOnChanges(changes: SimpleChanges) { 
    this.ngZone.run(() => this.contentPreview = changes['content'].currentValue;) 
} 

ここPlunker

だが
+0

お時間をありがとう! Chromeで見ると、コンテンツは実際にはコンポーネント内の「ng-reflect-content-t」に入れられています。コンポーネントにはまだ初期値が含まれています。これに関するどんな考えですか? –

+0

Hmm。プランナーで問題を試して再現できますか?あなたは私が提供したものをフォークすることができました。それを見てうれしく思います:) – Alex

+0

私のスクリプトはあなたのものによく似ていますが、テンプレートはレンダリングされません。その代わりに、データはng-reflect-variablenameに格納されます –

関連する問題