如何进行多地点"删除"使用Angular2中的AngularFire2或Firebase

时间:2017-01-18 23:19:20

标签: angular firebase promise firebase-realtime-database angularfire2

我想运行组合操作,在一次操作中删除Firebase上的2个节点。我知道如果我有节点位置,有remove()删除节点。但是什么是remove()操作返回?承诺还是可观察的?我怎么知道删除操作成功,所以我可以运行其他删除操作或告诉我的组件删除操作是否成功(或有错误)?

示例提供(需要有关AngularFire的多位置删除帮助的帮助):

constructor(private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {
   this.sdkDb = fb.database().ref();
}

deleteTask(taskId: string, jobtypeId: string): boolen {
const taskObservable = this.db.object('tasks' + '/' + taskId);
const taskPerJobtypeObervable = this.db.object('tasksPreJobtype' + '/' + jobtypeId + '/' + taskId);
taskObservable.remove()
  .then(_ => {
    console.log('success');
    taskPerJobtypeObervable.remove()
      .then(_ => {
        return ture
      });
  })
  .catch(err => {console.log(err, 'You dont have access!'), return false});

}

如你所见,我需要将删除链接作为一个承诺,我真的想避免。我希望这是可观察的模式,因为我使用angularFire2。因此,我想返回一个可观察的,而不是返回一个布尔值。我希望这是多位置删除。我该如何重构这段代码?非常感谢!

1 个答案:

答案 0 :(得分:3)

感谢Frank,我想我找到了解决方案并在此处分享解决方案:

我们的想法是将update()用于" null",并且它将在Firebase中删除它。

以下是重构代码:

deleteTask(taskId: string, jobtypeId: string): Observable<any> {

   let dataToDelete = {};
   dataToDelete['tasks/' + taskId] = null;
   dataToDelete['tasksPreJobtype/' + jobtypeId + '/' + taskId] = null;

   return this.firebaseUpdate(dataToDelete);
}

firebaseUpdate(dataToSave) {

   const subject = new Subject();

   this.sdkDb.update(dataToSave)
     .then(
       val => {
       subject.next(val);
       subject.complete();
     },
     err => {
      subject.error(err);
      subject.complete();
     }
   );

   return subject.asObservable();
}

有了这个,我的组件可以很容易地订阅deleteTask并仅在deleteTask返回true时进行重定向或其他选项。反应式编程的力量VS承诺:)