Вы не должны использовать EventEmitter
в сервисах, это только для components
Вместо этого вам нужно использовать Observable
с и BehaviorSubject/Subject
с, как показано ниже
@Injectable({
providedIn: 'root',
})
export class ShoppingListService {
itemDeleted : Subject<Ingredient> = new Subject<Ingredient>();
private itemDeleted$: Observable<Ingredient> = this.itemDeleted.asObservable();
deleteItem(item:Ingredient) {
this.itemDeleted.next(item);
}
}
в вашем компоненте
private unsubcribeAll: Subject<any> = new Subject<Any>();
ngOnInit() {
this.shoppingListService.itemDeleted
.pipe(
takeUntil(this.unsubcribeAll)
)
.subscribe((ingredient: Ingredient) => {
// this.ingredients.splice(ingredient, 1);
});
}
ngOnDestroy() {
this.unsubscribeAll.next();
this.unsubscribeAll.complete();
}
onDeleteItem(ingredient) {
this.shoppingListService.deleteItem(ingredient);
}
}
unsubcribeAll
в приведенном выше коде используется для предотвращения утечки памяти и отписки от наблюдаемого
Решение 2
, если ваши компоненты находятся в одной иерархии, вы не нужны службы для информирования о действиях.
например
recipe.component
<section>
<app-ingredient-list [ingredients]="recipeIngredients" (itemDeleted)="onItemDeleted($event)"></app-ingredient-list>
</section>
receipe.component.ts
onItemDeleted(item:Ingredient) {
// do what is needed here
}
ингридиент-list.component.ts
@Output() itemDeleted: EventEmitter<Ingredient> = new EventEmitter<Ingredient>();
onDeleteButtonClick(item: Ingredient) {
this.itemDeleted.emit(item);
}