使用 AngularFire 2 从 Firebase 中删除对象

Remove object from Firebase using AngularFire 2

我正在尝试创建一个删除函数,它将从 Firebase 中删除我的对象。

我在 FireBase 上有以下结构:

recipes   recipebooks      recipesPerRecipebook
  - id          - id        - recipebook_id
  - id          - id           - recipe_id: true

我想做的是当我点击删除时,我想从 recipes 中删除 recipe_id 并将其从 recipesPerRecipebook/${recipebook_id}

中删除

我在 recipes.service.ts

中创建了一个函数
deleteRecipe(recipe_id:string, recipebook_id:string) {
    this.sdkDb.child('recipes').remove(recipe_id)
      .then(
        () => alert('recipe deletion requested !')
      );

    this.sdkDb.child('recipesPerRecipebook/${recipebook_id}').remove(recipe_id)
      .then(
        () => alert('recipe Association deletion requested !')
      );
  }

然后我在 recipeDetails.component.ts

delete() {
    this.recipesService.deleteRecipe(this.recipe.$key, this.recipe.recipebook_id);
  }

我收到以下错误:

error_handler.js:54 Error: Firebase.remove failed: first argument must be a valid function.

我有两个问题,首先也是最重要的是我哪里出错了。其次做两次this.sdkdb.child(...感觉有点不对劲,麻烦能不能简化一下?

看起来很奇怪。

请看官方文档:https://github.com/angular/angularfire2/blob/master/docs/2-retrieving-data-as-objects.md#deleting-data

所以你应该能够像这样删除一个对象:

af.database.object('/--your-list-name--/--your-obejct-key--').remove();

其中 af 是注入的 AngularFire2 服务。

问题是 remove 不应该这样称呼。

如果您查看 documentation,您会看到 remove 进行可选回调。

所以你必须这样称呼它:

deleteRecipe(recipe_id:string, recipebook_id:string) {

  this.sdkDb.child(`recipes/${recipe_id}`)
    .remove()
    .then(() => alert('recipe deletion requested !'));

  this.sdkDb.child(`recipesPerRecipebook/${recipebook_id}/${recipe_id}`)
    .remove()
    .then(() => alert('recipe Association deletion requested !'));
}

此外,在您的代码段中,您没有对第二条路径使用反引号,因此 ${recipebook_id} 不会被评估和替换。

如果想一次删除两条路径,可以使用update:

deleteRecipe(recipe_id:string, recipebook_id:string) {

  this.sdkDb.update({
    `recipes/${recipe_id}`: null,
    `recipesPerRecipebook/${recipebook_id}/${recipe_id}`: null
  })
  .then(() => alert('deleted!'));
}

您可能还想考虑从 deleteRecipe 返回承诺,以便通知调用者删除完成。