几天来我一直在努力解决这个问题: 我正在做一个使用角度和电子的应用程序,所以我总是在生产环境中使用角度。 我使用电子的ipcMain和ipcRender在主进程和渲染之间进行通信以显示csv文件。 问题在于,创建可观察的fromEvent似乎不会触发角度changeDetection。 最初,我使用ChangeDetectorRef解决了问题,但这在材质组件上产生了奇怪的行为。 为了确保不会出错,我从“英雄之旅”应用程序中复制了代码,如果可观察对象是([1,2,3]),则一切正常...如果我在fromEvent中更改可观察对象的原点,则不会不再工作了。
服务:
[some pattern] <- move
组件
export class PresetService {
constructor(private electronService:ElectronService){}
read() {
this.electronService.ipcRenderer.send('read_presets');
}
getPresets():Observable<Preset[]> {
//return of([1,2,3,4]) //this works
this.read()
return fromEvent(this.electronService.ipcRenderer,'preset_res').pipe(
map(_=>_[1]),
tap(_ => console.log('fetched presets',_))//in the log i see an array of preset objects
);
}
}
和模板
export class PresetsComponent implements OnInit {
public presets:any[] //already tried to use observable here and ngFor with async pipe and the behavior was the same
selected = new FormControl(0);
constructor(private presesetService:PresetService/*, private cdr: ChangeDetectorRef*/ ) {
}
ngOnInit() {
this.getPresets()
}
getPresets(): void {
this.presesetService.getPresets()
.subscribe(presets => {
this.presets = presets
//this.cdr.detectChanges() //if i add this i see all presets but material tabs do not works properly
});
}
addTab(selectAfterAdding: boolean) {
this.presets.push(new Preset());
if (selectAfterAdding) {
this.selected.setValue(this.presets.length - 1);
}
}
removeTab(index: number) {
this.presets.splice(index, 1);
}
}
答案 0 :(得分:0)
问题解决了将分配包装在ngZone.run()
中相关代码:
getPresets(): void {
this.presetService.getPresets()//wrap at this level do not solve the issue
.subscribe(presets => {
this.zone.run(()=>{
this.presets = presets //wrapping only this solve the issue
})
});
}
感谢冷淡的提示!