2017-01-16 18 views
0

Angular2ゾーン内のプロファイルビューを更新するHTTPリクエストをどのように実行できるのでしょうか。この要求が非同期であるため、Angular2でNgZone内でHTTPリクエストを実行

export class ProfileComponent implements OnInit { 
    constructor(
     private auth: Auth, 
     private authHttp: AuthHttp) {} 

    ngOnInit() { 
     // update profile information 
     let headers: any = { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json' 
     }; 

     this.authHttp 
      .get('https://' + myConfig.domain + '/api/v2/users/' + this.auth.userProfile.user_id, {headers: headers}) 
      .map(response => response.json()) 
      .subscribe(
       response => { 
        this.auth.userProfile = response; 
        localStorage.setItem('profile', JSON.stringify(response)); 
       }, 
       error => console.log(error.json().message) 
      ); 

    } 
} 

問題は、プロフィールページのロードが前にこの要求が満たされていることと、プロファイル:私のトップレベル・プロファイル・コンポーネントでは、私は現在、authHttpを使用して、単一の単純なHTTPリクエストをやっています更新されます。何も起こらないのは、古いデータがプロファイルに読み込まれ、新しいデータが後で読み込まれるため、何も起こりません。次に、最後のリクエストからロードされた新しいデータを使用するだけなので、2回目のリフレッシュはすべて機能します。

この問題はNgZoneを使用して解決できますか?どういうわけかこの要求をゾーンに含めることができますか?終了したらコンポーネントツリーを再評価できますか?

+0

私はまだこれで少し混乱しています。何が更新されていませんか?あなたのビュー?ビューのauth.userProfileにバインドしていますか? authHttpによるリクエストが戻ったときに更新されませんか? – Steveadoo

+0

@Steveadoo 'auth.userProfile'からのデータのいくつかを入力としてプロファイルコンポーネントのテンプレート内の別のコンポーネントに渡していますので、' auth.userProfile'を更新する前に古いデータを入力として渡しています。 httpリクエスト –

+0

あなたはそれがゾーンの問題であることをどのように知っていますか? AuthHttpを見ると、angleのゾーンの外側で動くようには見えません。 Auth.userProfileを@Input()プロパティとして他のコンポーネントに渡すと、変更時に自動的に更新されます。この他のコンポーネントのngOnInitの@Inputプロパティを読んでいますか? – Steveadoo

答えて

1

あなたのコメントから、私はそれがゾーンとは関係ないと思います。 @Inputプロパティが変更されたときに、セカンダリコンポーネントを更新する必要があります。

export class SecondaryComponent { 

    private _myProperty: any; 
    @Input() 
    set myProperty(val: any) { 
     this._myProperty = val; 
     this.update(); 
    } 

    update() { //instead of ngOnInit just use this 
     //do stuff with _myProperty now 
    } 

} 

ただし、セカンダリコンポーネント内のauth.userProfileフィールドにバインドできないのはなぜですか。データを何らかの形でセカンダリコンポーネントのngOnInitメソッドの中に変換しない限り、それはおそらくもっと簡単でしょう。

関連する問題