我有一个使用Angular 2的Electron应用程序。该应用程序正常工作,直到使用ipcRenderer从本地JSON文件加载数据。然后,作用于服务中的数据的按钮不再触发改变检测过程以更新视图。我创建了一个简化的示例应用程序来演示此处的问题 https://github.com/marshmellow1328/electron-angular-change-detection
我不知道为什么按钮会停止触发本机更改检测。必须添加ChangeDetectorRef似乎不应该是必要的。如果是的话,我想了解原因。
答案 0 :(得分:8)
我调查了你的问题并确定它发生是因为readFile
处理程序在角度区域之外执行。因此,它不会对您的点击事件做出反应,因为您离开了区域负责变更检测。
最简单的解决方案是什么?
<强> app.component.ts 强>
constructor(private zone: NgZone) {
...
this.zone.run(() => {
data.values.forEach(( value ) => { this.service.addValue( value ); } );
});
然后你可以摆脱this.changeDetector.detectChanges();
使用zone.run(...)
,您明确地在Angulars区域内执行代码,然后运行更改检测。
还有一条建议:
我注意到app.component.ts
中的reduntant代码如下:
private service: Service;
constructor(service: Service ) {
this.service = service;
}
你可以像以下一样重写它:
constructor(private service: Service ) {}
希望这能帮到你!