【问题标题】:Angular 2 not updating *sometimes*Angular 2 不更新 *有时*
【发布时间】:2018-01-04 10:33:31
【问题描述】:

我有一个在 Electron 上运行的 Angular 4 应用程序。

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

  ngOnInit(): void {


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

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

});

this.Service.startService();
  }

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

问题: 通过对话框打开文件时,UI 会立即更新。在启动时加载最后一个会话时,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 方法发出 'Ready' 事件

【问题讨论】:

  • The service uses NgZone to trigger change detection.怎么样?
  • 已更新服务代码
  • 你看到console.log(this.session.name)输出了吗?
  • 嗯,也许“this.session = session”只有在您离开该区域时才生效?所以当你的 gui 被通知时,任务还没有生效?
  • @DavidBulté 是的,我看到了输出,当我在设置会话后进行加载时,一切正常。这似乎是在启动阶段的东西

标签: javascript angular electron


【解决方案1】:

为什么不像这样使用LoggerService

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

这将把这个变化放在下一个变化检测周期

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2016-10-10
  • 2018-08-29
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多