【问题标题】:Angular EventEmitter is not working in a callbackAngular EventEmitter 在回调中不起作用
【发布时间】:2020-01-19 12:26:31
【问题描述】:

我在课堂上对 EventEmitter 有一个奇怪的问题。虽然我有一些想法可以解决这个问题,但我想问你是否有想法直接解决我的问题。

简短摘要

我有一个父组件和一个子组件。父组件希望在子组件发生更改时得到通知。

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

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

问题

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

我的尝试

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

与此问题相关的其他帖子建议在 NgZone 跑步者中执行 .emit(),如下所示:

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

我在订阅回调中实现了这一点,但结果是控制台记录了true,但测试事件仍然从未发出。

这怎么可能?我能做什么?


编辑

所以我终于能够隔离问题,并在这个非常小的示例中进行了演示:https://stackblitz.com/edit/angular-46pndy

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

【问题讨论】:

  • 你说“几乎一样”。与您的应用有何不同?
  • 您的 stackblitz 示例似乎在每次单击按钮时都能成功发出,有什么问题?
  • 如果您的应用程序不像 stackblitz 演示那样,您应该在问题中包含您的应用程序的相关代码(HTML 标记 + 组件代码)。
  • 相关代码很难包含,这就是我尝试最小示例的原因。但是好像没有明显的解决办法或者问题,所以我会尽快更新帖子!
  • 我在新的 Stackblitz 中添加了一些信息。你知道为什么吸气剂会在这里造成所有这些麻烦吗?是有原因还是这甚至是一个错误?

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


【解决方案1】:

我认为这可能是 Angular 更改检测的奇怪行为。如果您禁用更改检测,则会收到该事件。

这里实际发生的是,当您使用 getter 创建按钮时,EventEmitter 实际上没有订阅者。分离更改检测可以解决问题,但可能会导致您的应用出现其他副作用。

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

StackBlitz 示例:here

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

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 2017-10-24
    • 1970-01-01
    • 2020-10-04
    • 2019-11-27
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多