Angular EventEmitter在回调中不起作用

时间:2019-09-18 14:01:38

标签: angular angular-components eventemitter angular-event-emitter

我在类中的EventEmitter有一个奇怪的问题。尽管我有一些解决此问题的想法,但我想问您是否有直接解决我问题的想法。

简短摘要

我有一个父项和一个子项。子组件中的某些内容发生更改时,父组件希望收到通知。

在孩子里面,我们有一个按钮。单击时,它将执行修改数据的http请求。在subscribe代码部分,我想通知父类已经完成了一些事情。

这分解了想法并按预期工作:https://stackblitz.com/edit/angular-l7hafr

问题

在我的应用程序中,只要在subscribe请求的http中完成,子组件的事件就不会发出。如果我之前(在订阅功能之外)发出事件,则它会按预期工作。

我尝试过的事情

我试图找到原因。问题是我根本无法设法隔离问题。上面的Stackblitz可以按预期工作,而我的应用程序中几乎没有相同。

与此问题相关的其他帖子建议像这样在NgZone运行程序中执行.emit()

this.ngZone.run(() => {
  console.log(NgZone.isInAngularZone());
  this.dataHasChanged.emit();
});

我在订阅回调中实现了此操作,但结果是控制台日志true,但测试事件为 still 从未发出。

这怎么可能?我该怎么办?


编辑

所以我终于能够找出问题所在,并且在这个非常小的示例中得到了证明:https://stackblitz.com/edit/angular-46pndy

所有问题的原因在于数组的getter中。为什么这会在这里引起问题?

1 个答案:

答案 0 :(得分:2)

我认为这可能与Angular变化检测有关。如果禁用更改检测,则会收到事件。

这里实际发生的是,当您使用getter创建按钮时,EventEmitter实际上没有订阅者。卸下变更检测可以解决此问题,但可能会在您的应用中引起其他副作用。

此StackBlitz演示了使用纯管道描述的一种解决方法。

示例StackBlitz:here

GitHub问题:
angular/angular/issues/6057
angular/angular/issues/5918