从Firebase ListObservable中删除对象

时间:2017-02-08 22:32:35

标签: angularjs firebase firebase-realtime-database angularfire2

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

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 observable。

修改

我找到了删除对象的方法,但我仍然对此不满意: 模板看起来如下:

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

代码:

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

如何删除对象而不使用它的Firebase密钥,例如在用户输入?是否有必要再次查询对象?如何使用ListObservable

直接删除对象

1 个答案:

答案 0 :(得分:2)

您可以通过将元素传递给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 /密钥(由push返回的可用者提供)传递给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的值。)