我在类中遇到一个有点奇怪的问题。虽然我有一些想法可以解决这个问题,但我想问你是否有直接解决我的问题的想法。
简短摘要
我有一个父组件和一个子组件。父组件希望在子组件中的某些内容发生更改时收到通知。
在孩子体内,我们有一个按钮。单击时,它会执行修改数据的 http 请求。在subscribe
代码部分,我想通知父类已经做了一些事情。
这分解了这个想法并按预期工作:https://stackblitz.com/edit/angular-l7hafr
A. 问题
在我的应用程序中,只要在http
请求的subscribe
完成子组件的事件,就永远不会发出该事件。如果我在订阅函数之外发出事件,它会按预期工作。
我试过什么
我试图找到原因。问题是我根本无法隔离问题。上面的 Stackblitz 按预期工作,而在我的应用程序中几乎相同。
与此问题相关的其他帖子建议在 NgZone 运行器中执行.emit()
,如下所示:
this.ngZone.run(() => {
console.log(NgZone.isInAngularZone());
this.dataHasChanged.emit();
});
我在订阅回调中实现了这一点,但结果是控制台记录true
,但测试事件仍然从未发出。
这怎么可能?我能做什么?
编辑
所以我终于能够隔离这个问题,它在这个非常小的例子中得到了证明:https://stackblitz.com/edit/angular-46pndy
所有问题的原因在于数组的getter
。为什么这会在这里引起问题?
我认为这可能是角度变化检测的奇怪行为。如果禁用更改检测,则会接收事件。
这里实际发生的事情是,当您使用 getter 创建按钮时,EventEmitter 实际上没有订阅者。分离更改检测可解决此问题,但可能会在应用中引起其他副作用。
此 StackBlitz 演示了使用纯管道描述的解决方法之一。
示例堆栈闪电战:这里
GitHub 问题:
角度/角度/问题/6057
角度/角度/问题/5918