Я получаю некоторые данные из http-запроса, которые я хочу передать родительскому компоненту через @Output и EventEmitter. Моя цель — создать новый элемент в дочернем компоненте и после того, как он будет успешно сохранен на бэкэнде, добавить идентификатор, созданный на бэкэнде, добавить его к элементу во внешнем интерфейсе и, наконец, добавить его в родительское представление.
Я попытался вызвать this.newItem.emit(item) из обратного вызова .finally() и .onComplete(), а также мы onNext(). Во всех случаях событие не было перехвачено родительским компонентом, за исключением случая, когда я выдал элемент сразу после блока .subscribe().
child.ts
/* */
@Output() newItemEmitter= new EventEmitter();
/* */
saveItem() {
let itemToView: {
... // A lot of data
};
this.itemService.saveItem(item).subscribe(result => {
itemToView = {
...
Id: result.Data
}
}, error => {console.log(error)}
, () => { console.log('Emitting!'); this.newItemEmitter.emit(itemToView) }
}
this.closeView() // Was not originally included. (1)
}
// this.newItemEmitter.emit(itemToView) // If emitting from
// here, itemToView will not contain the right Id from the backend.
Я намеренно опустил часть не относящегося к делу html.
parent.html
<ng-template let-c="close" let-d="dismiss">
<fixed-item (newItemEmitter)="addNewItemToView($event)" (closed)="closeAddNewItemTemplateView()">
</fixed-item>
</ng-template>
parent.ts
addNewItemToView($event) {
console.log('Received event from child: ', $event)
// Add to view here
}
Мой ожидаемый результат — Emitting!, за которым следует Получено событие от дочернего элемента, но на данный момент единственным выходом является Emitting!.
Изменить: (1): удаление this.closeView() решило проблему для меня. Я думаю, проблема заключалась в том, что событие было прервано, так как ng-шаблон закрыт.
Rxjs/Subject
вместо EventEmitter? - person Jacopo Sciampi   schedule 07.05.2019