Angular 4 事件发射器未发射

Angular 4 Event Emitter not Emitting

所以我有一个工作正常的事件发射器。在我的 child 中,我调用了一个函数:

(click)="EnterEditMode()

触发:

EnterEditMode(){ 
    this.enterEdit.emit(null);
  }

在我的parent中,我然后:

  enterEdit(){
    console.log("got some text");
  }  

这完美无缺。但现在我想在它旁边添加第二个输出。所以在 child 中,我调用:

SaveChanges();

其中触发了一个函数:

SaveChanges() {
    this.saveChanges.emit(null);
    console.log("save");
  }

当我调用它时,控制台日志被触发但发射没有被触发。我的 parent 有一个函数因此从未被调用。

saveChanges() {
    console.log("saving changes");
    this.editing ? this.editing = false : this.editing = true;
  }

我真的看不出我做错了什么,并尝试解决问题,但我没有收到任何错误,只有 "SaveChanges()" 已被调用的控制台日志。我是否遗漏了有关发射器的信息?

编辑以显示我的事件发射器

在我的 child 组件中:

@Output() enterEdit = new EventEmitter<any>();
@Output() saveChanges = new EventEmitter<any>();

同样,enterEdit 有效,但 saveChanges 无效...

所以这是由于对 Angular 中输出发射器的工作方式存在根本性误解。

假设错误 只需触发一个发射器就会迫使我的控制器做出反应。

解决方案 在我的 html 文件中,我必须将侦听器添加到元素,然后将事件从 html 传递到控制器。这会触发控制器执行该功能应该执行的操作。

在我的 .html 文件中,我需要将 (saveChanges)='saveChanges($event)' 添加到我的自定义组件。这行得通。

在我的例子中,事件发射器的名称必须与父项中的名称相匹配 在子组件控制器中:@Output('emittername') emitter 在父模板中:(emittername)="handler($event)"。 静默编译错误可以是一出戏。

在我的特殊情况下,我在没有警告或消息的情况下遇到了这个问题。

我的误解是这样的:

<app-child [someObject]="currentObject" (emitEventFunction)="saveChange($event)">

在我的模板标签中,我放置了发出事件的函数的名称 emitEventFunction(),而不是放置我用 @Output() 装饰器声明的对象。这意味着当我试图在我的子组件中调用 saveChange() 函数时调用函数 emitEventFunction() 时,Angular 实际上正在寻找一个名为 emitEventFunction 的对象。

解决方案自然是找到我声明为输出的内容:

@Output() entryChange = new EventEmitter<any>();

并改用它:

<app-child [someObject]="currentObject" (entryChange )="saveChange($event)">

检查清单

检查是否满足以下所有条件(以下示例):

  1. EventEmitter 是一个 @Output.
  2. emit 函数可以访问。
  3. 您正在调用模板中的函数。

例子

  1. EventEmitter 是一个 @Input:
@Component({
  selector: `TempratureCalculator`
  // ...
})
export class TempratureCalculator {
  @Input() tempratureChange = new EventEmitter<float>();

  change(t: float) {
    this.tempratureChange.emit(t);
  }
}

@Component({
  // ...
  template: `<TempratureCalculator (tempratureChange)="change(t)"></TempratureCalculator>
`
})
export class AppComponent {
  change(t: float) {}
}
  1. 检查 emit 是否可达:
// before
this.tempratureChange.emit(/* ... */);

// after
debugger;
this.tempratureChange.emit(/* ... */);

这将在发出之前暂停并在浏览器中打开调试器。如果那没有发生,则 emit 呼叫无法接通。

  1. 传递函数而不是调用它:
<!-- Wrong, Doesn't work -->
<TempratureCalculator (tempratureChange)="change"></TempratureCalculator>

<!-- This works -->
<TempratureCalculator (tempratureChange)="change(t)"></TempratureCalculator>

这是一个社区维基答案,欢迎扩展答案