将firebase可观察对象与angular2结合
Combining firebase observables with angular2
我正在开发一个angular2 - firebase应用程序,并且想知道一些最好的rxjs实践,我发现很难谷歌。
假设我有一个类"Project",它有"name"、"$key"等属性。还有"Note[]"answers"Task[]"的数组
"Note"answers"Task"是它们自己的类。
最初我在firebase中这样结构化数据:
- 项目
- <
- 名称/gh>
- 标记
- 任务
- Task1
- Task2等
- 笔记
- 注一
- 注2等
我将得到一个数据流,并使用map来得到我想要的数据。
但是后来我意识到这是不好的做法,项目树应该尽可能平坦,这样当我只需要项目元数据时,我就不会被迫加载所有内容。
所以我把它重新构造成这样:
- 项目
- Project1
- <
- 名称/gh>
- 标记 等
- Project2
- <
- 名称/gh>
- 标记 等
- Project1
- 任务
- Project1
- Task1
- <
- 名称/gh>身体
- Task2
- <
- 名称/gh>身体
- Task1
- Project2
- Task1
- <
- 名称/gh>身体
- Task2
- <
- 名称/gh>身体
- Task1
- Project1
- 笔记
- Project1
- 注一
- <
- 名称/gh>身体
- 注2
- <
- 名称/gh>身体
- 注一
- Project1
这样我就得到了"项目"、"笔记"answers"任务"三个数据流。把它合并成一个"项目"流,里面有"笔记"answers"任务",似乎是有意义的。
虽然我不确定最好的方法是什么?我写了一个长函数,将所有内容连接映射到"Project[]"的数组中,但现在我留下了一个数组而不是流,这肯定是错误的。
或者这是一个完全错误的方法?
期待你的想法。谢谢!H
我不完全理解你的结构,但如果你有"项目" "笔记"answers"任务"作为三个独立的流(我猜这意味着你有三个可观察对象)。你可以使用merge()
或concat()
来使用它们中的任何一个先出现的值,或者分别使用一个Observable:
let obs1 = Observable.from([1, 2, 3]).map(v => Observable.of(v).delay(1000)).concatAll();
let obs2 = Observable.from(['a', 'b', 'c']).map(v => Observable.of(v).delay(1000)).concatAll();
obs1.concat(obs2)
.subscribe(v => console.log(v));
obs1.merge(obs2)
.subscribe(v => console.log(v));
查看实时演示:http://plnkr.co/edit/TLxg1jOuhAN6U8xoQJIo?p=preview
第一个concat()
示例打印:
1
2
3
a
b
c
merge()
的第二个例子给出:
1
a
2
b
3
c
我想你应该明白这两者的区别。
不要介意obs1
和obs2
复杂的操作符变化。它只是用延迟发出每个值来模拟异步流。
- javascript结合了数组和字典
- 如何在Angular2中使用jQuery插件
- 不能从angular2中的子组件指定父组件中的数组
- 将Firebase与Electron结合使用
- 结合jQuery和jetpack无限滚动
- 将Angular js与taglib结合使用
- 将图像上传ajax与表单提交ajax相结合
- 如何为生产构建angular2应用程序
- 使用javascript协调angular2组件
- Angular2将组件方法导入到另一个组件中
- Angular2在装载前
- 将语句与jquery相结合,并使用媒体查询来实现返回页首按钮
- Angular2/JavaScript-如何显示localStorage保存的所有变量并获取所有键的总长度
- 基于路由的CSS样式-Angular2
- Angular2 ngFor—已选择集
- Angular2他们如何保存到缓存
- 将broccoliJS与当前使用requireJS的模块化主干应用程序结合使用,我想完全放弃requireJS
- Angular2 rc1, where is shims_for_IE
- Angular2 英雄示例在与节点.js服务器结合使用时使 POST 翻倍
- 将firebase可观察对象与angular2结合