0

En Firebase J'ai des articles objets, comme:scan Firebase Observable() et retour si répond à la condition

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' 

Maintenant, je veux prendre ceux dont validUntil (date) est encore à venir, donc en service que je fais:

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

et ressemble à cela fonctionne bien, mais comme vous le voyez, je .do(console.log) dans cette fonction et ce qui est étrange est que je reçois deux sorties dans la console - deux objets identiques. Est-ce que je le fais mal?

Répondre

2

Je ne sais pas pourquoi votre code ne fonctionne pas. Mais même si cela fonctionnait, ce serait loin d'être idéal: vous téléchargez toutes les données et ensuite supprimez les données périmées sur le client. Cela signifie que vous téléchargez des données que vos utilisateurs ne verront pas, ce qui est un gaspillage.

Je vous recommande de filtrer manuellement les données sur le serveur, comme indiqué dans le AngularFire2 documentation:

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

carte Utilisez ensuite un filtre pour bien filtre les articles:

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

Vous obtiennent probablement deux console.logs parce que vous vous abonnez deux fois à l'observable.

Je ne suis pas un expert AngularFire donc si l'observable ne peut pas filtrer sur le serveur, alors la réponse de Frank van Puffelen est meilleure.