2017-08-13 10 views
0

以下のように宣言されたコンポーネントがあり、入力データを受け取ります。私はPrimengカレンダーコンポーネントを使用していますが、 コンポーネントが作成されましたが、テンプレートに渡すデータにアクセスできません。 [(ngModel)] = "data.DateValue"にエラーが表示されます。 DataValueのようなものは既にそれにアクセスするときに存在しません角2+アクセス@Input Data.Property with [(ngModel)]

何が欠けていますか?

入力データを受け取った後に、タイプDateの(myDateValue:Date)のような補助値を設定する方法はありますか?

ありがとうございます。

import { Component, Input} from '@angular/core'; 
import { DataType } from "../model/dataType"; 

@Component({ 
    selector: 'exempleComponent', 
    template: '<p-calendar *ngIf="data" [(ngModel)]="data.DateValue" dateFormat="dd.mm.yy"></p-calendar>' 

}) 
export class ExempleComponent { 

    @Input() data: DataType; 

    constructor() { } 


} 

親コンポーネント:それはあるよう

import { Component, OnInit } from '@angular/core'; 
import { WebService } from './app.service'; 
import { MasterDataType } from "../model/masterDataType"; 

@Component({ 
    selector: 'my-app', 
    template: '<div> <exempleComponent [data]="theData.DataType" ><exempleComponent/> </div>', 
    providers: [WebService] 

}) 
export class AppComponent implements OnInit { 
    errorMessage: string; 
    theData: MasterDataType; 

    constructor(private dataService: WebService) {} 

    ngOnInit() { this.getDataFromService(); } 
    getDataFromService() { 
     this.dataService.getData() 
      .subscribe(
      myData => this.theData = myData, 
      error => this.errorMessage = <any>error); 
    }  
} 
+0

をロードする前に防ぐには、子コンポーネントをロードし、私は親コンポーネントを追加しました私が正しく受信他人のコンポーネントを持っているので、私はそれが親だとは思いませんデータは次のようになります:テンプレート上のvalue = {{data?.Value}} –

+0

[(ngModel)] = "data.DateValue"には何かがありますか? –

+0

訂正[(ngModel)] = "data.DateValue"は実際にはうまく動作します –

答えて

1

の問題が指摘されています。 data変数は未定義です。 Lifecycle Hooksの詳細を読む必要があります。あなたの子コンポーネント(ExempleComponent)が、

ngAfterContentInit時にロードされますが、あなたのサービスの呼び出しが完了(またはサブスクライブ)されていないためtheData変数は、この時期ではまだ定義されていません。例えば

data: SomeType; 
 
ngOnInit() { 
 
    console.log('START ngOnInit'); 
 
    this.service.getData().subscribe(_data => { 
 
    this.data = _data; 
 
    console.log('data', this.data); 
 
    }); 
 
    console.log('END ngOnInit'); 
 
}

上記のコードの結果は:

START ngOnInit

END ngOnInit

data Object

解決策は、読み込まれた後にデータをバインドする必要があることです。

解決方法1:

theData.DataTypeを初期化します。デフォルト値を指定します。

解決策2:

[(ngModel)] = "データ.DateValue?"。これは、data変数が使用可能かどうかを確認するためです(未定義またはnullではありません)。

解決策3:

あなたは、コンポーネントをロードする前にデータをロードするために役立つデータリゾルバを使用して検討すべきです。

解決策4:

その入力データが

+0

@Input()dateValue:string;子供にそれは働いた。しかし、私はobject.propertyまたはプロパティを渡すことの違いが表示されません –

+0

彼らはお互いに異なっています。 @Input()dateValue:stringを使用するとうまく動作します。 しかし、あなたは@Input()data:anyのような入力を与えてからはうまくいきません。 理由は次のとおりです。 子コンポーネントのテンプレートExampleコンポーネントは、入力データが渡される前にロードされます。 結果は次のとおりです。 **データ**は未定義として_assigned_になります。 次に、[(ngModel)] = "data.DataType"を使用します。 * data *変数が定義されていないので例外がスローされます –

+0

実際、私の問題は、すべてのコンポーネントを作成したダイナミックコンポーネントファクトリを持っていて、入力データをコンポーネントに設定する前に.detectChanges()そのように動作しましたが、データを設定した後、detectChanges()呼び出しがすべての問題を解決しました。とにかく、ここでの議論は私のコードについて考えさせました。私のコードを共有するためにいくつかのプランナーをする必要があります。 –

関連する問題