从 Firebase ListObservable 中移除对象

Remove object from a Firebase ListObservable

我正在开发一个 Angular2 应用程序,使用 Firebase 作为数据存储。第一步是使用集合并将对象推送到集合中:

this.weeks$ = angularFire.database.list("/weeks");
this.weeks$.push({
    id: ScheduleComponent.weekId(),
});

我现在想从集合中删除一周。我是否必须在 Firebase 中查询该对象并将其删除?或者有没有办法直接从 ListObservable 中删除一个对象?

应该没那么难...

我试图查询数据库,但这删除了整个集合:

this.angularFire.database.list('/weeks', {
    query: {
        id: weekId
    }
}).remove();

或者我是否必须在 ListObservable 上使用过滤器运算符来获取对象并将其删除?我正在尝试以下操作:

this.weeks$
    .find(week => week.id == weekId)
    .do(
        week => console.log(week)
        // here the delete code
    ).subscribe();

但是没有预期的结果?

我做错了什么?我认为这是不知道如何使用 Firebase Angular 2 绑定和不知道如何正确处理 rx observables 的组合。


编辑

我找到了一种删除对象的方法,但我仍然对它不满意: 模板如下所示:

<button class="btn btn-default (click)="deleteWeek(week.$key)">delete</button>

代码:

this.angularFire.database.object(`/weeks/${weekId}`).remove();

如何在不使用 Firebase 密钥的情况下删除对象,例如在用户输入上?是否需要再次查询该对象?如何使用ListObservable?

直接删除对象

您可以通过将元素传递给 remove 来从列表中删除元素。例如,这将删除第一个元素:

this.weeks$ = angularFire.database.list("/weeks");
this.weeks$
  .first()
  .subscribe((list) => this.weeks$.remove(list[0]));

您也可以将保存的快照传递给remove:

this.weeks$ = angularFire.database.list("/weeks", { preserveSnapshots: true });
this.weeks$
  .first()
  .subscribe((list) => this.weeks$.remove(list[0]));

您还可以将推送 ID/key(由 push 返回的 thenable 提供)传递给 remove:

this.weeks$ = angularFire.database.list("/weeks");
let key = this.weeks$.push({
  id: ScheduleComponent.weekId(),
}).key;
this.weeks$.remove(key);

密钥也可以从项目本身获得:

this.weeks$ = angularFire.database.list("/weeks");
this.weeks$
  .first()
  .subscribe((list) => this.weeks$.remove(list[0].$key));

(请注意,此答案中的代码并不是为了合理;它只是为了显示如何获取传递给 remove 的值。)