Произошла ошибка: @Output не инициализирован

102

Я работаю над приложением angular для менеджеров, чтобы отслеживать свои команды, и я застрял с ошибкой @Output:

An error occurred: @Output deleteMeeting not initialized in 'MeetingItemComponent'.

У меня есть компонент Meetings, создающий список компонентов MeetingItem. Я хочу выполнять действия, когда пользователь нажимает разные кнопки (редактировать, удалять, отображать детали).

Вот мой шаблон родительских собраний:

<div class="meeting__list" [@newMeeting]="meetings.length">
  <app-meeting-item
    *ngFor="let meeting of meetings"
    [meeting]="meeting"
    (deleteMeeting)="deleteMeeting($event)"
    (openMeetingDialog)="openMeetingDialog($event)"
    (messageClick)="openMessage($event)"
  ></app-meeting-item>
</div>

Мой шаблон MeetingItem (только часть, о которой идет речь в этой публикации):

<span class="meeting__actions">
    <mat-icon *ngIf="meeting.message" (click)="onMessageClick(meeting)" matTooltip="Read the message"
      matTooltipPosition="above" class="icon--notes">notes</mat-icon>
    <mat-icon (click)="onOpenMeetingDialog(meeting)" matTooltip="Edit this meeting" matTooltipPosition="above" class="icon--edit">edit</mat-icon>
    <mat-icon (click)="onDeleteMeeting(meeting.id)" matTooltip="Delete this meeting" matTooltipPosition="above" class="icon--delete">delete_outline</mat-icon>
  </span>

Компонент My MeetingItem:

import { Component, Input, Output } from '@angular/core';
import { EventEmitter } from 'events';

@Component({
  selector: 'app-meeting-item',
  templateUrl: './meeting-item.component.html',
  styleUrls: ['./meeting-item.component.scss']
})
export class MeetingItemComponent {

  @Input() meeting;

  @Output() deleteMeeting = new EventEmitter();
  @Output() openMeetingDialog = new EventEmitter();
  @Output() messageClick = new EventEmitter();

  constructor() {}

  onDeleteMeeting(meetingId) {
    this.deleteMeeting.emit(meetingId);
  }

  onOpenMeetingDialog(meeting) {
    this.openMeetingDialog.emit(meeting);
  }

  onMessageClick(meeting) {
    this.messageClick.emit(meeting);
  }
}
Аполлон
источник
1
Предоставленный код выглядит нормально, и вам будет легче отследить проблему, если вы предоставите демонстрацию stackblitz.
Сунил Сингх

Ответы:

383

Чтобы ваш код работал в stackblitz , мне пришлось заменить

import { EventEmitter } from 'events';

с участием

import { EventEmitter } from '@angular/core';
КоннорсФан
источник
5
Была такая же проблема, я рад, что нашел ответ! Я уже задавался вопросом, почему у моего EventEmitter нет универсального типа ;-)
MoxxiManagarm
У меня тоже работало, у меня была такая же проблема.
Владимир Деспотович
3
Я потратил час, а потом увидел это. Разочарование. Спасибо за ответ :)
Pankaj Parkar
11
Минута молчания для тех, кто здесь, из-за автоматического импорта из кода VS, который импортирован eventsвместо @angular/core.
Pramesh Bajracharya
1
@ArthurSiqueira Я чувствую боль: D.
Pramesh Bajracharya
20

Была такая же ошибка,

Импорт был правильным, как

import { EventEmitter } from '@angular/core';

Но определение переменной было неправильным:

@Output() onFormChange: EventEmitter<any>;

Должно быть:

@Output() onFormChange: EventEmitter<any> = new EventEmitter();
Петро Дарій
источник
Да. Та же ошибка возникает, когда EventEmitter не инициализируется компонентом. Я попытался инициализировать его внутри функции (чтобы уменьшить начальную загрузку представления), но у Angular этого не будет.
Jai
3

У меня была такая же проблема даже при импорте из @angular/core.

Проблема : я инициализировал EventEmmitterобъект в ngOnInitметоде из моего класса компонента. Решение : я перенес инициализацию в конструктор класса компонента.

Леонардо Соарес и Сильва
источник
2

В вашем компоненте просто используйте основной угловой модуль. Просто поместите этот код в начало файла.

import { EventEmitter } from '@angular/core'; 
Санкет Гададе
источник
8
Ваш ответ кажется копией части ответа ConnorsFan. Я думаю, тебе следует удалить его
Фабрицио
1

Для меня это работает, если я изменяю ниже импорт import {EventEmitter} из 'events';

к

import { Component, Output ,EventEmitter} from '@angular/core';
vaibhav.patil
источник
0

изменить импорт: import { EventEmitter } from 'events'; с помощью:import { EventEmitter } from '@angular/core';

РидаХлели
источник
объясните, что было не так и как работает ваше решение.
Абхишек
0

@Output() isAbout: EventEmitter<boolean> = new EventEmitter(); Это должен быть весь синтаксис, чтобы он работал, вам нужен экземпляр эмиттера событий

Сай Паван
источник