在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'
现在我想接受validUntil
(约会)即将到来的人,所以在服务中我做了:
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)
那样奇怪的是我在控制台中得到两个输出 - 两个相同的对象。我做错了吗?
答案 0 :(得分:2)
我不确定为什么你的代码无效。但即使它可以工作,它也会不太理想:您正在下载所有数据,然后删除客户端上过时的数据。这意味着您正在下载用户看不到的数据,这很浪费。
我建议改为过滤服务器上的数据,如AngularFire2 documentation所示:
return this.afDb.list('articles', {
query: {
orderByChild: 'validUntil',
startAt: '2017-09-29T21:00:00.000Z'
}
});
答案 1 :(得分:1)
使用地图然后过滤到过滤文章:
getValidArticles(): Observable<Article[]> {
return this.afDb.list('articles')
.map((articles) =>
articles.filter((article) =>
new Date(article.validUntil).getTime() >= new Date().getTime()));
}
你可能得到两个console.logs,因为你订阅了两次可观察量。
我没有AngularFire专家,所以如果观察者无法过滤服务器端,那么Frank van Puffelen的答案会更好。