2017-02-03 12 views
1

角度2で@inputを使用して親コンポーネントから子コンポーネントにデータを通信します。目的は、値パラメータ@inputを使用して子コンポーネントでサービスを呼び出したいのですが、 valueプロパティは "undefine"です。これは私の子コンポーネントです:子コンポーネントで@inputプロパティを使用して角2でサービスを呼び出す

import { Component, OnInit, EventEmitter, Input,Output } from  '@angular/core'; 

@Component({ 
    selector: 'app-child', 
    templateUrl: './child.component.html' 
}) 

export class ChildComponent implements OnInit { 


    @Input() productId: any; --> working perfectly if bind into html 

    constructor() { 

    } 

    ngOnInit(): void { 
     console.log(this.productId) --> undefine? 
    //in this methode i will call service to fetch another data from database using parameter productId.. 


    } 
} 

これを解決するには?

+0

なぜ定義する必要があると思いますか? 'productId'はどこから来たのですか?親コンポーネントからの –

+0

、あなたの答えは完璧です@GünterZöchbauer – sembilanlangit

+0

サーバからフェッチすると、 'ngOnInit()'が呼び出されたときにまだ利用できません。 setterまたは 'ngOnChanges'は後で設定されるデータに対しても機能します。 'ngOnInit()'は、コンポーネントの作成時に既に利用可能なデータに対してのみ機能します。 –

答えて

2

あなたはngOnChangesまたはngAfterViewInitのいずれかを使用する必要があります。

export class ChildComponent implements OnChanges { 
    // Subscribe to the change event and update the model 
    ngOnChanges(changes: {[propName: string]: SimpleChange}) { 
     let key = 'Data'; 
     this.productId = changes[key].currentValue; 
    } 
} 
+0

速い応答のための@Boyanに感謝 – sembilanlangit

1
@Input() 
set productId(value: any) { 
    console.log(value); 
} 
+0

ありがとう@Gunter働いている – sembilanlangit

+0

あなたが必要なのは、セッター内でアクションを実行し、実際にどこでもproductIdを使用しないならば十分です。しかし、この変数にアクセスする必要がある場合は、getterも実装し、 "バッキングフィールド"を持つ必要があります。 – muzurBurcu

4

私はゲッターとセッターを使用し、セッターの内側に、あなたのサービスコールになるだろう。

// Declare a private underlying variable for the getter and setter 
private _productId: any; 
@Input() 
set productId(id: any){ 
    this._productId = id; 
    // Make your service call here 
} 
get productId(){ 
    return this._productId; 
} 
+0

はい、私は成功しているコールサービス – sembilanlangit

+0

聞いてうれしい!これで問題が解決した場合は、回答に合格とマークしてください。ハッピーコーディング! – muzurBurcu

関連する問題