对 属性 的更改未出现在真实设备上的模板中

Changes to the property not appearing in template on real device

在我的 Ionic 5 应用程序中,当互联网连接不可用时,我将向用户显示带有一些文本的叠加层。

我有以下功能来检测互联网是否可用。

checkOnline$(): Observable<boolean> {
    return merge(
      of(navigator.onLine),
      fromEvent(window, 'offline').pipe(mapTo(false)),
      fromEvent(window, 'online').pipe(mapTo(true)),
      );
}

在我的构造函数中,我调用了上面的函数。

this.checkOnline$().subscribe(isOnline => {

  if (!isOnline) {
    console.log('>>>>>> offLine');
    this.online = false;
  } else {
    console.log('>>>>>> online');
    this.online = true;
  }
  console.log('>>>>>> ##### this.online = ', this.online)
      
});

模板中使用 属性 online 根据互联网的可用性显示或隐藏覆盖。

<div id="offline-overlay" *ngIf="!online" class="center-vertically">
    <div id="offline-overlay-text" class="center-content">
      <span>ABCD EFGH IJKL</span>
    </div>
</div>

以上设置工作正常。我按预期获得所有控制台日志,并根据 wifi 的可用性正确显示或隐藏覆盖。但仅在浏览器上。

当我将应用程序推送到设备时,它不起作用。为了检查 属性 online 是否分配了正确的值,我尝试在模板中打印它。

{{online}}

不,它没有得到正确的值。但在浏览器中,它确实得到了正确的值。

我调试了安装到设备上的应用程序以检查控制台日志。这些按预期记录。

这是为什么?

为什么浏览器和设备上的行为不同?

我该如何解决这个问题。

提前致谢。

编辑:

我添加了日志来检查 属性 online 是否获得了正确的分配值。当在设备上 运行 时,它确实获得了正确的值。现在只是模板没有得到那个值。

JoshMorony 在本教程中介绍了如何创建“连接”服务:http://www.joshmorony.com/creating-an-advanced-google-maps-component-in-ionic-2/ 2.8k。 (第三部分)

它检测它是在设备上还是通过浏览器运行,并使用检查 Internet 连接的最佳方法。

否则我建议直接检查 Ionic 对象,例如:https://ionicframework.com/docs/native/network 而不是 window 与浏览器相关的对象,而不是本机移动组件。

找到解决方案。

原来是订阅里面的代码突破了Angular区。

我按照以下步骤解决了这个问题。

this.checkOnline$().subscribe(isOnline => {
      console.log('************* isonline = ', isOnline);
      if (isOnline) {
        console.log('>>>>>> online');

        this.zone.run(() => {
          this.isOffline = false;
          this.globalDataService.setAppOnline();
        });

      } else {
        console.log('>>>>>> offline');

        this.zone.run(() => {

          this.isOffline = true;
          this.globalDataService.setAppOffline();

        });

      }
}); 

感谢这个回答: