【发布时间】:2017-06-05 18:42:24
【问题描述】:
更新:
我遇到的空值字段问题与我的数据库中不存在的键有关,因此这里的大部分内容都不适用于您的问题。如果您正在寻找一种在 AngularFire2 中“加入”查询的方法,那么下面接受的答案可以很好地解决这个问题。我目前使用combineLatest 而不是forkJoin。为此,您必须import 'rxjs/add/observable/combineLatest';。
我有以下非规范化 Firebase 结构:
members
-memberid1
-threads
-threadid1: true,
-threadid3: true
-username: "Adam"
...
threads
-threadid1
-author: memberid3
-quality: 67
-participants
-memberid2: true,
-memberid3: true
...
我想在我的threads 视图中呈现username,该视图按quality 排序。
我的服务:
getUsername(memberKey: string) {
return this.af.database.object('/members/' + memberKey + '/username')
}
getFeaturedThreads(): FirebaseListObservable<any[]> {
return this.af.database.list('/threads', {
query: {
orderByChild: 'quality',
endAt: 10
}
});
}
我的组件:
ngOnInit() {
this.threads = this.featuredThreadsService.getFeaturedThreads()
this.threads.subscribe(
allThreads =>
allThreads.forEach(thisThread => {
thisThread.username = this.featuredThreadsService.getUsername(thisThread.author)
console.log(thisThread.username)
})
)
}
由于某种原因,这会将看起来未完成的 observable 记录到控制台。
我想将这些值放入threads 的属性中,这样我就可以像这样在我的视图中呈现它:
<div *ngFor="let thread of threads | async" class="thread-tile">
...
{{threads.username}}
...
</div>
更新:console.log 用于 allThreads 和 thisThread
更新:订阅 getUsername()
this.featuredThreadsService.getUsername(thisThread.author)
.subscribe( username => console.log(username))
这样做的结果是没有值的对象:
【问题讨论】:
-
您的
getUsername方法不返回任何内容。这是故意的吗? -
但是如果
thisThread记录了那个对象,thisThread.username怎么可能是未定义的呢? -
嗯,你也可以仔细检查一下这条线吗?
this.af.database.object('/members/' + memberKey + 'username')不应该是this.af.database.object('/members/' + memberKey + '/username')吗? -
getUsername(memberKey: string) 那不是一个可观察的对象吗?你不需要订阅吗?就像你为 this.thread 所做的一样。
-
提醒一下,如果您使用
combineLatest,请删除first运算符,以免内部可观察对象完成。
标签: angular typescript firebase firebase-realtime-database angularfire2