เกิดข้อผิดพลาด: @Output ไม่ได้เตรียมใช้งาน


102

ฉันกำลังทำงานกับแอพเชิงมุมสำหรับผู้จัดการเพื่อติดตามทีมของพวกเขาและฉันติดอยู่กับข้อผิดพลาด @Output:

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

ฉันมีคอมโพเนนต์การประชุมสร้างรายการคอมโพเนนต์ 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>

ส่วนประกอบ 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 ได้
Sunil Singh

คำตอบ:


383

เพื่อให้รหัสของคุณทำงานในstackblitzฉันต้องแทนที่

import { EventEmitter } from 'events';

ด้วย

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

5
เพิ่งมีปัญหาเดียวกันฉันดีใจที่พบคำตอบ! ฉันสงสัยอยู่แล้วว่าทำไม EventEmitter ของฉันไม่มีประเภททั่วไป ;-)
MoxxiManagarm

ทำงานให้ฉันด้วยฉันมีปัญหาเดียวกัน
Vladimir Despotovic

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 ไม่มี
ใจ

3

ฉันมีปัญหาเดียวกันแม้กระทั่งการนำเข้าจาก@angular/core.

ปัญหา : ฉันกำลังเริ่มต้นEventEmmitterอ็อบเจ็กต์ในngOnInitเมธอดจากคลาสคอมโพเนนต์ของฉัน วิธีแก้ไข : ฉันย้ายการเริ่มต้นไปยังตัวสร้างคลาสของคอมโพเนนต์


2

ในส่วนประกอบของคุณเพียงแค่ใช้โมดูลเชิงมุมหลัก เพียงใส่รหัสนี้ที่จุดเริ่มต้นของไฟล์

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

8
คำตอบของคุณดูเหมือนเป็นส่วนหนึ่งของคำตอบของ ConnorsFan ฉันคิดว่าคุณควรลบมัน
Fabrizio

1

สำหรับฉันมันใช้งานได้ถ้าฉันเปลี่ยนด้านล่างนำเข้า import {EventEmitter} จาก 'events'

ถึง

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

0

เปลี่ยนการนำเข้า: import { EventEmitter } from 'events'; ด้วย:import { EventEmitter } from '@angular/core';


เพิ่มคำอธิบายว่ามีอะไรผิดปกติและวิธีแก้ปัญหาของคุณทำงานอย่างไร
Abhishek

0

@Output() isAbout: EventEmitter<boolean> = new EventEmitter(); นี่ควรเป็นไวยากรณ์ทั้งหมดเพื่อให้ใช้งานได้คุณต้องมีอินสแตนซ์ของตัวปล่อยเหตุการณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.