2017-07-28 66 views
3

我有一个运行在Electron上的Angular 4应用程序。角2没有更新*有时*

在我的主要组件中,我运行了一个服务,它打开一个保存的文件并将其参数设置为名为“会话”的对象。

ngOnInit(): void { 


this.Service.ready.subscribe(() => { 

    this.session = this.Service.session; 
    console.log(this.session.name) 

}); 

this.Service.startService(); 
    } 

我要么使用文件对话框打开会话文件,要么在初始化应用程序时加载上一个会话文件。我通过订阅我的服务在完成加载文件时发出的'就绪'事件来更新我的用户界面。请注意,对于打开最近的文件并使用对话框加载文件,它都运行相同的方法。

问题: 当通过对话框打开文件文件时,UI get立即更新。在启动时加载最后一个会话时,UI不会更新。

我试过了什么 该服务使用NgZone触发变化检测。 该订阅显示正确的会话设置为变量'this.session' 我试过使用ChangeDetectorRef但没有区别。

当我使用相同的方法和事件触发它时,为什么变化检测有差异?它是否与正在初始化的组件有关?

更新展示区在服务更新

从我的服务:

loadSession(path: string): void { 

    fs.readFile(path, { encoding: 'utf-8' }, (err, data) => { 
     if (!err) { 

      var session = JSON.parse(data); 

      console.log(session); 

      this.zone.run(() => { 

       this.session = session; 

       this.readyToStart(); 

       this.notify("Opened Session:", this.session.name, null); 

       console.log("opened session"); 
      }); 

     } else { 
      console.log(err); 
     } 
    }); 
} 

我readyToStart方法发出 '就绪' 事件

+0

'该服务使用NgZone触发更改检测。“它看起来如何? – yurzui

+0

已更新服务代码 – WJM

+0

您是否看到console.log(this.session.name)输出? –

回答

0

为什么不使用LoggerService这样的:

this.logger.tick_then(() => this.session = this.Service.session); 

这将在下一个更改检测周期中进行此更改

+0

嗨,迪恩,我假定你正在谈论这个定制服务? https://github.com/angular/angular.io/blob/master/public/docs/_examples/lifecycle-hooks/ts/src/app/logger.service.ts我试过这个,但它不会改变这个问题 – WJM