0

満たしているかどうかを返す:今、私はそのvalidUntil(日)、それらを取るためにFirebase観察可能なスキャン()と私のような記事のオブジェクト、しているFirebaseで条件

articles 
UNIQUE_KEY 
    title: 'Some title' 
    validUntil: '2017-09-29T21:00:00.000Z' 
UNIQUE_KEY 
    title: 'Other title' 
    validUntil: '2017-10-29T21:00:00.000Z' 

をしたいが、まだ近日発売予定されているので、サービスで、私は実行します。

getValidArticles(): Observable<Article[]> { 
    return this.afDb.list('articles').do(console.log) 
     .scan((article) => { 
     if (new Date(article.validUntil).getTime() >= new Date().getTime()) { 
      return article; 
     } 
     }) 
    } 

そして、あなたが私その関数内.do(console.log)見るとどのような奇妙なのですが、私は、コンソールに2つの出力を得ることであるとして、それがうまく機能のように見えますが、 - 二つの同一のオブジェクトを。私はそれを間違っているのですか?

答えて

2

あなたのコードが機能しない理由はわかりません。しかし、それがうまくいくとしても、それは理想的ではないでしょう:すべてのデータをダウンロードして、クライアント上の古いデータを削除しています。つまり、ユーザーに表示されないデータをダウンロードしているため、無駄です。

AngularFire2 documentationに示したように、私は、代わりに、サーバー上のデータをフィルタリングすることをお勧めしたい

getValidArticles(): Observable<Article[]> { 
    return this.afDb.list('articles') 
    .map((articles) => 
     articles.filter((article) => 
     new Date(article.validUntil).getTime() >= new Date().getTime())); 
} 

ます:その後、フィルタ記事ウェルにフィルタリング

return this.afDb.list('articles', { 
    query: { 
    orderByChild: 'validUntil', 
    startAt: '2017-09-29T21:00:00.000Z' 
    } 
}); 
1

使用マップobservableに2回購読しているのでおそらく2つのconsole.logが得られています。

私はAngularFireのエキスパートではありませんので、オブザーバブルでサーバサイドをフィルタリングできない場合は、Frank van Puffelenの答えが良いです。

関連する問題