Angular 角度及;Firebase-如何使用服务或组件更新Firebase?
我所拥有的和我正在努力做的Angular 角度及;Firebase-如何使用服务或组件更新Firebase?,angular,firebase,angularfire,angular-services,Angular,Firebase,Angularfire,Angular Services,我所拥有的和我正在努力做的 我有一个服务,从firebase获得一个“专辑”列表 我有一个组件,它有一些输入字段来添加新项 作为firebase数据非规范化的一部分,我有两个节点需要更新。”“相册列表”和“相册详细信息” 我可以用下面的代码更新到firebase(不包括底部的firebase建议) 我知道我可能需要在我的示例中包含另一个服务。一个用于唱片集列表,一个用于唱片集摘要 问题 我看到了firebase中的一些示例代码,这些代码介绍了如何在多个位置更新代码,并为两个新节点创建一个新键
- 我有一个服务,从firebase获得一个“专辑”列表
- 我有一个组件,它有一些输入字段来添加新项
- 作为firebase数据非规范化的一部分,我有两个节点需要更新。”“相册列表”和“相册详细信息”
- 我可以用下面的代码更新到firebase(不包括底部的firebase建议)
- 我知道我可能需要在我的示例中包含另一个服务。一个用于唱片集列表,一个用于唱片集摘要
从'@angular/core'导入{Injectable};
从“./Album.model”导入{Album};
从“angularfire2/database”导入{AngularFireDatabase,FirebaseListObservable};
@可注射()
导出类服务{
专辑:FirebaseListObservable;
构造函数(专用数据库:AngularFireDatabase){
this.albums=database.list('albums');
}
getAlbums(){
归还这个。相册;;
}
添加相册(新相册:相册){
this.albums.push(newAlbum);
}
getAlbumById(albumId:string){
返回此.database.object('/albums/'+albumId);
}
updateAlbum(localUpdatedAlbum){
var albumEntryInFirebase=this.getAlbumById(localUpdateAlbum.$key);
albumEntryInFirebase.update({
标题:localUpdatedAlbum.title,
艺术家:localUpdatedAlbum.artist,
描述:localUpdatedAlbum.description
});
}
}
这在很大程度上取决于偏好和风格。尽管如此,在一个或多个服务中隔离特定于firebase的操作几乎总是一个更好的主意
然而,我想知道定义许多方法(如addAlbum
)是否真的值得。我个人的偏好是让服务只提供一个FirebaseListObservable
,并直接在组件中执行。push
。可能有人认为需要额外的抽象层——例如,他们可能会例如,画一个场景,从Firebase切换到其他东西。然而,在实践中,这是不可能的,如果你决定这样做,这种简单的抽象层无论如何也不会对你有多大帮助
作为次要的一点,如果您有一个专门用于相册的完整服务,我觉得没有必要在所有方法名称中重复“相册”一词。为什么不只是add()
将新对象推送到一个节点上,然后使用相同的键在其他地方创建子节点的标准模式是
this.albumService.list.push(albumData)
.then(({key}) => this.albumService.summariesObject(key).update(stuff));
换句话说,将数据推送到列表中,生成一个新的密钥,等待承诺通过包含密钥的快照来实现,然后用必要的数据更新另一个节点中具有该密钥的对象的
FirebaseObjectObservable
。最好尽量保持AngularFire范式,尽管允许在有些情况下,您必须退回到firebase.database().ref
这类事情。很多这是一个偏好和风格的问题。尽管如此,在一个或多个服务中隔离firebase特定的操作几乎总是一个更好的主意
然而,我想知道定义许多方法(如addAlbum
)是否真的值得。我个人的偏好是让服务只提供一个FirebaseListObservable
,并直接在组件中执行。push
。可能有人认为需要额外的抽象层——例如,他们可能会例如,画一个场景,从Firebase切换到其他东西。然而,在实践中,这是不可能的,如果你决定这样做,这种简单的抽象层无论如何也不会对你有多大帮助
作为次要的一点,如果您有一个专门用于相册的完整服务,我觉得没有必要在所有方法名称中重复“相册”一词。为什么不只是add()
将新对象推送到一个节点上,然后使用相同的键在其他地方创建子节点的标准模式是
this.albumService.list.push(albumData)
.then(({key}) => this.albumService.summariesObject(key).update(stuff));
换句话说,将数据推送到列表中,生成一个新的密钥,等待承诺通过包含密钥的快照来实现,然后用必要的数据更新另一个节点中具有该密钥的对象的
FirebaseObjectObservable
。最好尽量保持AngularFire范式,尽管允许在有些情况下,你必须回到firebase.database().ref
这类事情上。Hi Torazaburo-感谢你花时间回复。非常感谢。最好避开.firebase.database(主要是因为无论发生什么事,我总是得到“找不到firebase”).如果不太麻烦的话,你能给我举一个例子,说明你的代码如何与我上面的代码相匹配吗?(如前所述,我对这一切都很陌生,并试图让我了解所有部分是如何组合在一起的)假设在提交表单方法中,我想将标题、艺术家和描述推送到firebase albums节点,我想将标题和艺术家推送到albumsList firebase节点。但是albums>key/albumsList>key(其中两个键相同)另外,我更喜欢让服务提供数据并在组件中进行推送的想法