【问题标题】:How to do a multi-location "remove" with AngularFire2 or Firebase in Angular2 [duplicate]如何在 Angular2 中使用 AngularFire2 或 Firebase 进行多位置“删除”[重复]
【发布时间】:2017-06-03 12:38:58
【问题描述】:

我想运行一个组合操作以在一次操作中删除 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});

}

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

【问题讨论】:

  • 它似乎返回了一个承诺:github.com/angular/angularfire2/blob/…。您还可以使用单个多位置update() 呼叫在一次呼叫中将它们全部删除。 firebase.googleblog.com/2015/09/…
  • 感谢弗兰克的快速共同!是的,它返回一个带有 angularFire remove() 的承诺。但是由于这是一个多位置“删除”,如果我链接这个承诺,它看起来很丑陋。我想使用您提到的“多位置更新()”方法。但该链接只有更新示例。我如何删除(我不能使用更新来删除节点对吗?!)我提供了一个例子来说明这一点。
  • 当你发布null时它会被删除。啊,但我看到你已经发现了。 :-)

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


【解决方案1】:

感谢弗兰克,我想我找到了解决方案并在这里分享解决方案:

这个想法是使用 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 承诺的力量 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2018-09-22
    • 2016-11-18
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多