2015-12-21 20 views
31

içinde tanımlanmamıştır. Bileşenin @ Giriş değerini yapıcıda veya ngOnInit öğesinde almayı dener. Ama her zaman "tanımsız" olarak geliyor.@Input özelliği, açısal 2'nin onInit

Sorunu (beta açısal) göstermek için hero.conf ile hero plunker'ı güncelleştirdim. 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) 
    } 
} 

yanlış burada ne yapıyorum?

+0

Hmm, ... örnekte biz immidatelly Hero seçerek olmadığını ben fark etmedi plunker'da çalışmadığı için mutluydu :) Ben plunker'da kontrol ettim ve gayet iyi çalışıyor. Ancak benim kodumda çalışmıyor, ama başlatılıyor ... yanlış plunker için özür dilerim. Cevabı kabul edeceğim ancak sorunumu çözmeyecek. – eesdil

+0

Bu yüzden problem, "input-property" yerine "InputProperty" de "inputProperty" koymuş olmama neden oldu ... garip birşey yapmadı ... ancak API dokümantasyonunda bu şekilde yazılmıştır. – eesdil

cevap

45

bileşen bu noktada selectedHero anda aslında bir Hero nesne

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

içinde geçmemiş bir sıfırlanır noktada AppComponent hiçbir değeri yoktur çünkü ngOnInit tanımlanmamış alıyoruz nedenidir ve listedeki tıklama olayı, onSelect yöntemini

olarak adlandırıncaya kadar olmaz. Düzenleme: Üzgünüm, aslında bir düzeltme önermedim. Bu my-hero-detail bileşenin başlangıç ​​durumuna geciktirecek olmalı ve konsol çıkışını görmelisiniz bir ngIf

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

my-hero-detail Sizin ekleyin. Bu , alışkanlığı seçtiğinde, seçilen kahraman değiştiğinde yeniden çıkış olur.

+3

benim sorunumu çöz, bu yüzden thx. Kutunun dışında düşünün, yeni bir şey keşfedebilirsiniz – materliu

+0

Teşekkürler bir ton .... – user2180794

25

Bunun nedeni, kahramanların eşzamansız olarak yüklenmesidir, bu nedenle görünüm başlangıçta oluşturulduğunda, seçilen kahraman tanımsızdır. Fakat sonra bir seçim yapıldıktan sonra, kahraman tanımlı bir değerle ayrıntıların görünümüne aktarılır.

Temel olarak onInit çağrısını yalnızca orijinal değere (undefined) göre görüyorsunuz.

Eğer her seçimden sonra yürütülecek benzer bir şey istiyorsanız, bunu şöyle değiştirebilirsiniz:

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

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

Bu en üstünde olmalıdır. Teşekkürler!!! – IvRRimUm

+0

Evet, gerekir. Angular5 kullanılarak –

+0

. Hata: ExpressionChangedAfterItHasBeenCheckedError: İfade, kontrol edildikten sonra değişti. Önceki değer: 'undefined'. Geçerli değer: '[nesne nesnesi]'. –