【发布时间】:2020-10-01 07:08:01
【问题描述】:
我正在开发一个 Angular 项目,该项目通过 AngularFirestore 在 Udemy 的课程之后与 Firestore 数据库进行交互,我有以下疑问:
首先课程展示了这种方式来检索 Course 对象的数组,以这种方式:
ngOnInit() {
this.db.collection('courses').snapshotChanges()
.subscribe(snaps => {
const courses: Course[] = snaps.map(snap => {
return <Course> {
id: snap.payload.doc.id,
...snap.payload.doc.data() as Course
} as Course;
})
console.log(courses);
});
}
所以根据我的理解,它是这样工作的:
在组件初始化中,它调用 AngularFirestore 对象(名为 db)上的 snapshotChanges() 方法来获取课程 Firebase 集合。此方法返回一个 Observable,当集合的元素发生变化时,我可以订阅它以获取整个集合。因此,当 Firebase 中的元素更改时,它会检索一组快照。我使用 map() 运算符迭代每个 snapthsoet 元素,使用其内容创建并返回一个新的 Course 对象,该对象将插入到最终的 课程:课程[]数组。
推理正确吗?如果我的理解是正确的,那么在课程的其他地方它以这种方式实现类似的行为:
ngOnInit() {
// Retrieve document sapshot, return all the courses with IDs:
this.courses$ = this.db.collection('courses').snapshotChanges()
.pipe(map(snaps => {
return snaps.map(snap => {
return <Course> {
id: snap.payload.doc.id,
...snap.payload.doc.data() as Course
}
});
}));
}
在这里我发现了一些问题来理解它是如何工作的。
它总是检索 coures Firebase 集合的快照,而不是订阅返回的 Observable 对象,它使用 pipe()。在这种情况下 pipe() 究竟是什么?
然后在我看来,它正在对检索到的快照集合进行迭代(如前一个示例中所做的那样),但随后使用单个快照元素来构建它正在使用的 Course 对象map 第二次在这个 snaps 参数上(应该包含快照列表)
为什么?我错过了什么?
【问题讨论】:
-
pipe是 observable 上的一种方法,它允许链接各种 rxjs 运算符。pipe表示您可以链接各种运算符,例如(map[它与 JS 的 array.map 不同]、mergeMap或许多其他运算符)以根据应用程序需要处理数据。这是 oof rxjs 的基础。另一方面,subscribe方法,它调用负责可观察对象的函数。我强烈推荐观看youtube.com/watch?v=E3Eego8xKdk 和youtube.com/watch?v=3LKMwkuK0ZE
标签: angular firebase google-cloud-firestore rxjs