網站搜尋

typescript - Angular:事件和「subscribe 不是一個函數」錯誤


我剛開始學習一些基本的 Angular 4,並且在監聽發出的事件時遇到了困難。這裡有一個相當簡單的範例可以重現這個問題(至少在我這邊是這樣):

DateSenderComponent 正在“廣播”當前日期,然後由其父組件 AppComponent 處理(見下文):

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

@Component({
  selector: 'app-date-sender',
  template: '<button (click)="sendDate()">Send</button>'
})

export class DateSenderComponent {
  @Output() dateSent = new EventEmitter();

  sendDate(){
    var dt = new Date();
    console.log(dt);
    this.dateSent.emit(dt.toString());
  }
}

AppComponent 應該要監聽廣播的日期事件:

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

@Component({
  selector: 'app-root',
  template: '<app-date-sender (dateSent)="dateReceived($event)"></app-date-sender>'
})

export class AppComponent {
  dateReceived(value){
    console.log('Result: ', value);
  }
}

從各種初學者教程中,我發現這是監聽事件的方法。然而,當載入頁面時,我得到以下錯誤,而不是打印收到的日期值:

AppComponent.html:1 錯誤 TypeError: instance[output.propName].subscribe 不是一個函數

在 createDirectiveInstance (core.es5.js:10727)

在 createViewNodes (core.es5.js:12086)

在 callViewAction (core.es5.js:12530)

在 execComponentViewsAction (core.es5.js:12439)

在 createViewNodes (core.es5.js:12113)

在 createRootView (core.es5.js:11991)

在 callWithDebugContext (core.es5.js:13206)

在 Object.debugCreateRootView [作為 createRootView] (core.es5.js:12666)

在 ComponentFactory_.create (core.es5.js:9912)

在 ComponentFactoryBoundToModule.create (core.es5.js:3448)

不幸的是,我無法找到任何關於這實際意義的資訊,我也無法自己弄明白它。

有一件事似乎是一個提示:當我將 AppComponent 的模板更改為監聽某個在任何地方都沒有被發出(emit)的事件時(例如 <app-date-sender (someStringSent)="dateReceived($event)"></app-date-sender>),錯誤就消失了。所以實際輸出的事件和模板對它的監聽之間似乎有某種關聯,這似乎是問題的原因。

有人可以指引我正確的方向嗎?

答案#1

EventEmitter 應該來自 '@angular/core'

我看到你的程式碼是從 'events' 來的。

你確定你使用的是正確的物件嗎?

答案#2

問題在這裡:

import { EventEmitter } from "events";

你必須像這樣從 @angular/core 匯入 EventEmitter:

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