2017-07-28 67 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