2016-11-17 1 views
2

Я пытаюсь создать функцию удаления, которая удалит мой объект из Firebase.Удалить объект из Firebase с помощью AngularFire 2

I имеют следующую структуру на 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(... дважды чувствует себя немного неправильно и громоздко, могу ли я это упростить?

ответ

6

Выглядит довольно странно.

Пожалуйста, обратите внимание на официальные документах: 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.

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 так, что абонент может быть информирован об удалении комплектующие.