2016-11-12 8 views
1

戻り値を更新して、完了時に表示する方法を教えてください。角度2 - Observableが戻り値を更新する

は、それがこのようなHTMLから呼び出されている

subscribeItemsForUsername(username: string): Observable<Item[]> { 
     let returnedList = this.af.database.list('users', { 
     query: { 
      orderByChild: 'username', 
      equalTo: username, 
     } 
    }); 

    return returnedList; 
    } 

答えて

0

非同期パイプ

参考使用することにより:https://angular.io/docs/ts/latest/guide/pipes.html#async-pipe

変更をここで

// the item.username is from a higher loop which works. 
<div *ngFor="let eqItem of getTest(item.username)"> 



getTest(username: string): Item[] { 
let itemArray: Item[]; 
this.usersService.subscribeItemsForUsername(username).subscribe(z => { 
    itemArray = z; 
    //return z; 
}); 
return itemArray; 
} 

はサービスです見る:

<div *ngFor="let eqItem of getTest(item.username) | async"> 

getTest方法は、観察などを返す必要があります:

getTest(username: string): Observable<Item[]> { 
    return this.usersService.subscribeItemsForUsername(username).map(res=> res.json()); 
} 
+0

すでにパイプを使用しているので、一度に2つのパイプを使用する方法はありますか? – John

+0

@Johnもちろん、 '...のような非同期の後に置いてください。非同期| anotherPipe' – echonax

0

あなたが購読メソッドにパラメータとして送信機能は、将来的に呼ばれるコールバックです。 getTestメソッドが彼の仕事を終了した後に呼び出される可能性があります。itemArray = zしかし、itemArrayは現時点でexsistではありません。

ビュー内の行<div *ngFor="let eqItem of getTest(item.username)"><div *ngFor="let eqItem of []">と同等ですThatsなぜ(購読方法であなたのコールバックはgetTestメソッドが終了した後

ソリューションexcuteうとします。

を@echonaxが述べたように、Asyncがされます最善の解決策要するに

<div *ngFor="let eqItem of getTest(item.username) | async"> 

getTest(username: string):Observable<Item[]>{ 
return this.usersService.subscribeItemsForUsername(username); 
} 

:非同期パイプが加入しunsubsribe(コンポーネントはdestoryedされるべき後)およびtが返されますo ngForアレイ(この場合)。

+0

すでにパイプを使用しているので、一度に2つのパイプを使用する方法はありますか? – John

+0

はい、追加のパイプは配列を取得する必要があります(つまり、非同期パイプは 'getTest(item.username)'から返されます)Observable –

関連する問題