2017-08-20 7 views
0

パイプ内からFirebaseデータベースに問い合わせて値を返すことは可能ですか?Angular4/AngularFire2:パイプ内のファイアベースを照会していますか?

私は、次のHTML

<div *ngFor="let item of items"> 
    <h2> 
     {{item.firstName}} {{item.middleName}} {{item.lastName}} 
    </h2> 

    <div *ngFor="let lifeItem of (item.$key | event: 'life')"> 
     Born: {{lifeItem.start}} 
    </div> 
</div> 

そして、次のパイプがあります。

import { Pipe, PipeTransform } from '@angular/core'; 
import { AngularFireDatabase } from 'angularfire2/database'; 

@Pipe({ 
    name: 'event' 
}) 

export class EventPipe implements PipeTransform { 
    subscriptions: Array<any> = new Array<any>(); 
    items: Array<any> = new Array<any>(); 
    constructor(
     protected db: AngularFireDatabase 
    ){} 

    public transform(personId: any, eventType: any) { 
     if (!personId || !eventType) return []; 

     console.info("personId: " + personId); 
     console.info("eventType: " + eventType); 

     this.subscriptions.push(
      this.db.list('/event', { 
       query: { 
        limitToLast: 200 
       } 
      }).subscribe(items => { 
       console.info(items); 
       this.items = items; 
       return this.items; 
      }) 
     ); 

    } 
} 

私はこれを実行すると、私はコンソールでこれを取得し...

enter image description here

...ページの対応するセクションには何も描画されません。

答えて

1

私は角度AsyncPipe

これを試し
export class EventPipe implements PipeTransform { 
    constructor(protected db: AngularFireDatabase){} 

    public transform(personId: any, eventType: any) { 
     if (!personId || !eventType) return Observable.of([]); 
     return this.db.list('/event', { 
      query: { 
       limitToLast: 200 
      } 
     }); 
    } 
} 

<div *ngFor="let lifeItem of (item.$key | event: 'life' | async)"> 
    Born: {{lifeItem.start}} 
</div> 
+0

「Observable」はどこから届いていますか? 'rxjs/Observable'から 'import {Observable}'を試しましたが、 ''タイプ 'のオブザーバブル'オブザーバブル ' –

+1

' rxjs/add/observable/of ';' –

+0

パイプライン内のアイテムをさらにフィルタリングすることは可能ですか?私はこれを持っています: 'if(!personId ||!type)return Observable.of([]); \t \t出力= this.db.listせ( '/イベントを'、{ クエリは:{ \t \t \t \t orderByChild: '人'、 \t \t \t \t equalTo: } \t \tをPERSONID})。 \t \t return output; "出力"をさらにフィルタリングして、イベントタイプに一致する項目のみを含むことができますか? –

0

DB呼び出しが非同期操作であるため、データが利用可能になるまでの遅延を考慮する必要があります。 *ngFor="let lifeItem of (item.$key | event: 'life' | async)?.items"

注:私はこのコードを自分でテストしていませんでしたつかん.items前に、このような

何かを二パイプとヌル・チェックなどの非同期パイプを使用してみてください。ちょうど提案をしてください。

+0

を使用する方がよい、と思います。私はもはやエラーを得ることはなく、データも取得しません。 :-) –

+0

@ eat-sleep-code最後に '.items'を除外するようにngForを変更しましたか?私は今あなたがデータを取得していることを理解していますか? – nGAGE

関連する問題