Событие не перехвачено при запуске из rxJs subscribe onComplete обратный вызов

Я получаю некоторые данные из 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-шаблон закрыт.


person Anders    schedule 07.05.2019    source источник
comment
убедитесь, что вы импортируете класс eventemitter из '@angular/core'.   -  person Darsan S Kumar    schedule 07.05.2019
comment
Он импортируется. Я на Angular 5, если это имеет значение.   -  person Anders    schedule 07.05.2019
comment
хорошо, я думаю, что itemToView не входит в область действия внутри функции, в которой он генерируется.   -  person Darsan S Kumar    schedule 07.05.2019
comment
Переход на глобальную область видимости this.itemToView не изменился :(   -  person Anders    schedule 07.05.2019
comment
Просто мне любопытно, вы пробовали использовать Rxjs/Subject вместо EventEmitter?   -  person Jacopo Sciampi    schedule 07.05.2019
comment
Да, не повезло :!   -  person Anders    schedule 07.05.2019
comment
Излучайте внутри блока подписки, сразу после окончания itmeToView   -  person Ritesh    schedule 07.05.2019
comment
stackblitz.com/edit/angular-s7cmsc Ваш тот же код отлично работает для меня   -  person Darsan S Kumar    schedule 07.05.2019
comment
Эй, я добавил кусок кода, который был виновником. Поскольку дочерний компонент находится внутри шаблона, закрытие указанного шаблона каким-то образом удалило событие из цикла событий. Теперь я должен найти другой способ закрытия шаблона.   -  person Anders    schedule 07.05.2019


Ответы (1)


Моя проблема заключалась в том, что я вызвал this.closeView(), чтобы закрыть компонент. Вместо того, чтобы закрывать дочерний компонент из самого дочернего элемента, теперь я вызываю метод destroy из родительского компонента. Я считаю, что вызов this.closeView() каким-то образом удаляет сгенерированное событие из цикла обработки событий, если источником события является обратный вызов subscribe.

person Anders    schedule 08.05.2019