我正在Angular和Firebase中进行我的第一个项目,我快完成了。
我有一个关于同时使用两个对象删除对象的问题。我有一项将删除对象的服务。该对象内部还有另一个称为“图片”的对象,该对象具有两个属性key: string
和url: string
。
我想确保在删除该对象时也从存储中删除文件,我发现这种方式行得通,但是我认为这不是正确的方式,特别是因为出现TS错误:
“错误TS2339:类型'{}'上不存在属性'picture'。”
有人可以帮我吗?这是我的删除方法:
deleteEvent(id: string) {
const obj = this.db.object(this.NODE + id);
const getPic = obj.snapshotChanges().subscribe(
(a) => {
console.log(a.payload.val());
this.storage.ref(this.NODE + a.payload.val().picture.key).delete();
}
);
return obj.remove();
}
答案 0 :(得分:1)
我会说你有要点。如果唯一困扰您的是Linting错误,则可以使用方括号表示法代替点表示法:this.NODE + a.payload.val()['picture']['key']
...如果情况破裂,我可能会在其中引入一些错误处理。
一方面,对于一个小的改进,我建议不要仅使用预订一次从数据库中获取数据。 AngularFire2提供了一种方法,可以以较少的开销来设置可观察项/订阅项(无论如何将其删除)。如果要这样做,我会写成这样:
deleteEvent(id: string)
{
return this.db.database.ref(this.NODE + id).once('value').then( data => {
console.log(data.val());
return this.storage.ref(this.NODE + a.payload.val()['picture']['key']).delete().then( () => {
console.log('Success!');
return this.db.database.ref(this.NODE + id).remove();
}).catch( err => {
console.log(`Error deleting ${this.NODE + a.payload.val()['picture']['key']} from storage:`);
console.log(err);
});
}).catch( err => {
console.log(`Error obtaining /${this.NODE + id} from the database:`);
console.log(err);
});
}
* 未经测试的代码
我是Promise的忠实拥护者(,好像你听不懂),而AngularFire2经常使用它们-使得处理错误变得更加容易。