Wystąpił błąd: @Output nie zainicjowano


116

Pracuję nad aplikacją kątową dla menedżerów, aby śledzić swoje zespoły i utknąłem z błędem @Output:

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

Mam składnik Meetings, generujący listę składników MeetingItem. Chcę wykonywać akcje, gdy użytkownik kliknie różne przyciski (edytuj, usuń, pokaż szczegóły).

Oto mój szablon Spotkań z rodzicami:

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

Szablon My MeetingItem (tylko część, której dotyczy ten wpis):

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

Mój składnik 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
Dostarczony kod wygląda dobrze i łatwiej byłoby prześledzić problem, gdybyś udostępnił demo stackblitz.
Sunil Singh,

Odpowiedzi:


428

Aby twój kod działał w stackblitz , musiałem go wymienić

import { EventEmitter } from 'events';

z

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

5
Właśnie miałem ten sam problem, cieszę się, że znalazłem odpowiedź! Zastanawiałem się już, dlaczego mój EventEmitter nie miał typu ogólnego ;-)
MoxxiManagarm

U mnie też zadziałało, miałem ten sam problem.
Vladimir Despotovic

4
Spędziłem godzinę, a potem to zobaczyłem. Denerwujący. Dzięki za odpowiedź :)
Pankaj Parkar

16
Chwila ciszy dla tych, którzy tu są ze względu na automatyczny import z kodu VS, który zaimportował eventszamiast @angular/core.
Pramesh Bajracharya

1
@ArthurSiqueira Czuję ból: D.
Pramesh Bajracharya,

22

Miał ten sam błąd,

Import był poprawny jak

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

Ale definicja zmiennej była błędna:

@Output() onFormChange: EventEmitter<any>;

Powinien być:

@Output() onFormChange: EventEmitter<any> = new EventEmitter();

Tak. Ten sam błąd występuje, gdy EventEmitter nie jest zainicjowany ze składnikiem. Próbowałem zainicjować go w funkcji (aby zmniejszyć początkowe ładowanie widoku), ale Angular go nie ma.
Jai

3

Miałem ten sam problem nawet podczas importowania z @angular/core.

Problem : inicjowałem EventEmmitterobiekt w ngOnInitmetodzie z mojej klasy komponentów. Rozwiązanie : przeniosłem inicjalizację do konstruktora klasy komponentu.


2

W swoim komponencie po prostu użyj podstawowego modułu kątowego. Po prostu umieść ten kod na początku pliku.

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

9
Twoja odpowiedź wydaje się być kopią części odpowiedzi ConnorsFan. Myślę, że powinieneś go usunąć
Fabrizio

1

U mnie to działa, jeśli zmienię poniżej importuje import {EventEmitter} z 'wydarzeń';

do

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

1

zmień import: za import { EventEmitter } from 'events'; pomocą:import { EventEmitter } from '@angular/core';


dodaj wyjaśnienie, co było nie tak i jak działa Twoje rozwiązanie.
Ak47

1

@Output() isAbout: EventEmitter<boolean> = new EventEmitter(); Powinna to być cała składnia, aby działała, potrzebujesz instancji emitera zdarzeń

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.