我在类中的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
中。为什么这会在这里引起问题?
答案 0 :(得分:2)
我认为这可能与Angular变化检测有关。如果禁用更改检测,则会收到事件。
这里实际发生的是,当您使用getter创建按钮时,EventEmitter实际上没有订阅者。卸下变更检测可以解决此问题,但可能会在您的应用中引起其他副作用。
此StackBlitz演示了使用纯管道描述的一种解决方法。
示例StackBlitz:here
GitHub问题:
angular/angular/issues/6057
angular/angular/issues/5918