2016-11-17 31 views
0

子ルートがほとんどない親コンポーネントUserComponentがあります。任意の子ルートからUserComponentの関数を呼び出せるようにしたい。これは、UserComponentと、たとえば、子コンポーネントのProfileComponentが表示される必要があるデータを取得するためにUserServiceの機能を使用していますが、ProfileComponentのデータを編集すると、データはUserComponentにリフレッシュされません(ngOnInit())、私はそれが変更を聞いていないと思う)。親コンポーネント呼び出しを関数に呼び出す2

CODE UserComponent

error: string; 
user: IProfile | {}; 

constructor(private router: Router, private userService: UserService) {} 

ngOnInit() { 
    this.getUser(); 
} 

getUser() { 
    this.userService.getProfile().subscribe(
    response => this.user = response, 
    error => this.error = error 
); 
} 

はCODE ProfileComponent

user: IProfile | {}; 
error: string; 

constructor(private userService: UserService) {} 

ngOnInit() { 
    this.userService.getProfile().subscribe(
    response => { 
     this.user = response; 
    }, 
    error => this.error = error 
); 
} 

update() { 

    ... 

    this.userService.updateProfile(data).subscribe(
    response => console.log(response), 
    error => this.error = error 
); 
} 

CODE UserService

private profileURL = 'http://localhost:4042/api/v1/profile'; 

    constructor(private http: Http) {} 

    getProfile(): Observable<Object> { 
    let headers = new Headers({ 'Authorization': 'Bearer ' + localStorage.getItem('access_token') }); 
    let options = new RequestOptions({ headers: headers }); 

    return this.http.get(this.profileURL, options) 
        .map(this.handleResponse) 
        .catch(this.handleError); 
} 

private handleResponse(data: Response): IProfile | {} { 
    return data.json() || {}; 
} 

private handleError (error: Response | any): Observable<Object> { 

    ... 

    return Observable.throw(errMsg); 
} 

updateProfile(data): Observable<Object> { 
    let body = JSON.stringify(data); 
    let headers = new Headers({ 'Authorization': 'Bearer ' + localStorage.getItem('access_token'), 'Content-Type': 'application/json;charset=utf-8' }); 
    let options = new RequestOptions({ headers: headers }); 

    return this.http.patch(this.profileURL, body, options) 
      .map((response: Response) => response) 
      .catch(this.handleError); 
} 
+1

私はプロファイルデータが変更され、それらを再クエリーさせるときにコンポーネントに通知するためにobservableを使用します。 –

答えて

0

ジョン・ベアードのおかげで、私は含まUserServiceupdated = new BehaviorSubject<boolean>(false)を作成することができましたそのプロファイルが編集されたかどうかの情報子コンポーネントからプロファイルを編集したとき、私はそのサブジェクトの次の値をtrueに設定しましたthis.updated.next(true)。反対側では、私はUserComponentの変更の件名を購読し、被験者の価値の変化に伴い、データを更新したgetProfile()の機能を解雇しました。

関連する問題