2015-12-21 26 views
31

コンストラクタまたはngOnInitでコンポーネントの@Input値を取得しようとしています。しかし、それは常に「未定義」となっています。角度2のonInitで@Inputプロパティが定義されていません

私は、問題を示すために、console.logでヒーロープランナーを更新しました(ベータ版)。 http://plnkr.co/edit/dseNM7OTFi1VNG2Z4Oj5?p=preview

export class HeroDetailComponent implements OnInit { 
    constructor(){ 
    console.log('hero', this.hero) 
    } 
    public hero: Hero; 

    ngOnInit() { 
    console.log('hero', this.hero) 
    } 
} 

私はここで間違って何をしているのですか?

+0

うーん、私は、一例では、我々はimmidatellyヒーローを選択していないことを認識していなかった...私はそれはplunkerで働いていないことも幸せだった:)私はそれをplunkerでチェックし、うまくいきます。しかし、私のコードでは動作しませんが、初期化されています...間違ったplunkerのために申し訳ありません。私は答えを受け入れますが、それは私の問題を解決しません。 – eesdil

+0

問題は、camelCaseのプロパティ "inputProperty"を@Input ... "input-property"の代わりに入れてしまったことです。...奇妙なことには分かりませんでした。しかしAPIドキュメントではこのように書かれています。 – eesdil

答えて

45

コンポーネントがこの時点selectedHeroで、あなたが実際にHeroオブジェクト

<my-hero-detail [hero]="selectedHero"></my-hero-detail> 

に合格していない初期化される時点で、あなたのAppComponentで値を持たないので、あなたがngOnInitで未定義なっている理由は、リストのクリックイベントがonSelectメソッドを呼び出すまで続きます

編集:申し訳ありませんが、私は実際に修正を提供していないことを認識しました。あなたはngIf

my-hero-detailから
<my-hero-detail *ngIf="selectedHero" [hero]="selectedHero"></my-hero-detail> 

を追加する場合は、このmy-hero-detailコンポーネントの初期化を遅らせるだろう必要がありますし、コンソール出力が表示されるはずです。このですが、選択したヒーローが変更されたときに再び出力されます。

+3

私の問題を解決します。箱から考えて、何か新しいものを発見するかもしれない – materliu

+0

ありがとうトン... – user2180794

25

ヒーローが非同期に読み込まれるため、ビューが最初にレンダリングされるとき、選択されたヒーローは未定義です。しかし、選択が行われた後、ヒーローは定義された値で詳細ビューに渡されます。

基本的には、元の値(未定義)に基づいてonInit呼び出しが表示されます。

あなたは、各選択後に実行するのに似た何かをしたい場合、あなたはこのようにそれを変更することができます。

export class HeroDetailComponent implements AfterViewChecked { 
    constructor(){ 
    console.log('hero', this.hero) 
    } 
    public hero: Hero; 

    ngAfterViewChecked() { 
    console.log('hero', this.hero) 
    } 
} 
+1

これは一番上にあるはずです。ありがとう!!! – IvRRimUm

+0

はい、そうすべきです。 –

+0

はangular5を使用しています。エラー:ExpressionChangedAfterItHasBeenCheckedError:式がチェックされた後に変更されました。以前の値: 'undefined'現在値: '[オブジェクトオブジェクト]'。 –

関連する問題