Ein Fehler ist aufgetreten: @Output nicht initialisiert

90

Ich arbeite an einer eckigen App, mit der Manager ihre Teams verfolgen können, und ich habe einen @ Output-Fehler:

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

Ich habe eine Meetings-Komponente, die eine Liste der MeetingItem-Komponenten generiert. Ich möchte Aktionen ausführen, wenn der Benutzer auf verschiedene Schaltflächen klickt (Bearbeiten, Löschen, Details anzeigen).

Hier ist meine Vorlage für übergeordnete Meetings:

<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>

Meine MeetingItem-Vorlage (nur der Teil, der von diesem Beitrag betroffen ist):

<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>

Meine MeetingItem-Komponente:

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);
  }
}
Apollo
quelle
1
Der bereitgestellte Code sieht gut aus und lässt sich leichter nachverfolgen, wenn Sie eine Stackblitz-Demo bereitstellen können.
Sunil Singh

Antworten:

346

Damit Ihr Code in einem Stackblitz funktioniert , musste ich ihn ersetzen

import { EventEmitter } from 'events';

mit

import { EventEmitter } from '@angular/core';
ConnorsFan
quelle
5
Hatte gerade das gleiche Problem, ich bin froh, dass ich die Antwort gefunden habe! Ich habe mich schon gefragt, warum mein EventEmitter keinen generischen Typ hat ;-)
MoxxiManagarm
Arbeitete auch für mich, ich hatte das gleiche Problem.
Vladimir Despotovic
3
Ich verbrachte eine Stunde und sah das dann. Frustrierend. Danke für die Antwort :)
Pankaj Parkar
8
Ein Moment der Stille für diejenigen, die aufgrund eines automatischen Imports aus VS-Code, der eventsstatt importiert wurde, hier sind @angular/core.
Pramesh Bajracharya
1
@ ArthurSiqueira Ich fühle den Schmerz: D.
Pramesh Bajracharya
18

Hatte den gleichen Fehler,

Import war richtig wie

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

Aber die Variablendefinition war falsch:

@Output() onFormChange: EventEmitter<any>;

Sollte sein:

@Output() onFormChange: EventEmitter<any> = new EventEmitter();
Петро Дарій
quelle
Ja. Der gleiche Fehler tritt auf, wenn EventEmitter nicht mit der Komponente initialisiert wird. Ich habe versucht, es innerhalb einer Funktion zu initialisieren (um die anfängliche Ansichtslast zu verringern), aber Angular hat es nicht.
Jai
2

Ich hatte das gleiche Problem sogar beim Importieren von @angular/core.

Das Problem : Ich habe das EventEmmitterObjekt in der ngOnInitMethode aus meiner Komponentenklasse initialisiert . Lösung : Ich habe die Initialisierung in den Klassenkonstruktor der Komponente verschoben.

Leonardo Soares und Silva
quelle
1

Verwenden Sie in Ihrer Komponente nur das Kernwinkelmodul. Fügen Sie diesen Code einfach am Anfang der Datei ein.

import { EventEmitter } from '@angular/core'; 
Sanket Gadade
quelle
8
Ihre Antwort scheint eine Kopie eines Teils der Antwort von ConnorsFan zu sein. Ich denke, Sie sollten es löschen
Fabrizio
0

Bei mir funktioniert es, wenn ich unten den Import von {EventEmitter} aus 'events' ändere;

zu

import { Component, Output ,EventEmitter} from '@angular/core';
vaibhav.patil
quelle
0

Ändern Sie den Import: import { EventEmitter } from 'events'; mit:import { EventEmitter } from '@angular/core';

RidhaHleli
quelle
Fügen Sie eine Erklärung hinzu, was falsch war und wie Ihre Lösung funktioniert.
Abhishek
0

@Output() isAbout: EventEmitter<boolean> = new EventEmitter(); Dies sollte die gesamte Syntax sein, damit es funktioniert. Sie benötigen die Instanz des Ereignis-Emitters

Sai Pavan
quelle