使用AngularFire 2从Firebase中删除对象

时间:2016-11-17 11:21:02

标签: angular firebase firebase-realtime-database angularfire2

我正在尝试创建一个删除功能,该功能将从Firebase中删除我的对象。

我在FireBase上有以下结构:

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

我想要做的是当我点击删除时,我想从recipe_id删除recipes,并将其从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(...两次感觉有点不对,而且我可以简化这个很麻烦吗?

2 个答案:

答案 0 :(得分:8)

看起来很奇怪。

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

所以你应该能够删除这样的对象:

var distinctValues = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER")).Distinct().ToList();
var duplicateValues = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER")).SelectMany(a => a.Skip(1)).Distinct().ToList();
var duplicatesRemoved = dt.AsEnumerable().Except(duplicateValues);

其中af.database.object('/--your-list-name--/--your-obejct-key--').remove(); 是注入的AngularFire2服务。

答案 1 :(得分:0)

问题在于不应该如何调用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返回承诺,以便可以通知来电者完成删除。