我的firebase
数据库中有以下数据结构:
我添加了child_added
方法,该方法在运行应用程序时返回firebase
的所有条目,然后将其显示在HTML
表中。
问题是,它没有为每个错误返回自动生成的Id。
这是我的方法:
getAddedBugs(): Observable<any> {
return Observable.create(obs => {
this.bugsDbRef.on('child_added', bug => {
const newBug = bug.val() as Bug;
obs.next(newBug);
},
err => {
obs.throw(err)
});
});
}
class
Bug
如下所示:
export class Bug {
constructor(
public id: string,
public title: string,
public description: string,
public status: number,
public severity: number,
public createdBy: string,
public createdDate: number,
public updatedBy?: string,
public updatedDate?: number
) {}
}
那么问题是,如何让我的方法也包括自动生成的Id,因为我需要这个Id来更新/删除等。
我用谷歌搜索过,不幸的是我无法找到任何相关信息。
有人可以说明我如何解决这个问题吗?
答案 0 :(得分:2)
而不是将事件的快照价值投射到Bug
(它不是Bug
;它只是Object
}),您应该使用快照中的信息创建Bug
实例。快照包含密钥(自动生成的ID)和值:
getAddedBugs(): Observable<any> {
return Observable.create(obs => {
this.bugsDbRef.on('child_added',
snapshot => {
// The snapshot's value will be an Object, not a Bug instance.
const val = snapshot.val();
const bug = new Bug(
snapshot.key, // The auto generated ID.
val.title,
val.description,
... etc.
);
obs.next(bug);
},
err => {
obs.throw(err)
});
});
}
您还应该考虑返回一个在取消订阅时删除事件侦听器的函数:
getAddedBugs(): Observable<any> {
return Observable.create(obs => {
const listener = snapshot => {
const val = snapshot.val();
const bug = new Bug(
snapshot.key,
val.title,
val.description,
... etc.
);
obs.next(bug);
}
this.bugsDbRef.on('child_added', listener, err => { obs.throw(err) });
return () => this.bugsDbRef.off('child_added', listener);
});
}