【问题标题】:Can someone explain to me why I don't see connection status in this code?有人可以向我解释为什么我在这段代码中看不到连接状态吗?
【发布时间】:2019-02-27 08:03:09
【问题描述】:

我需要有关 ionic Network 插件的帮助。这是一个代码,但它对我不起作用。没有控制台日志或任何其他模式。没有错误。 在顶部

import { Network } from '@ionic-native/network';

ionViewDidLoad() {
    this.getWarrentsNumber();
    let disconnectSubscription = this.network.onDisconnect().subscribe(() => {
        console.log('network was disconnected :-(');
    });

    disconnectSubscription.unsubscribe();

    let connectSubscription = this.network.onConnect().subscribe(() => {
        console.log('network connected!');
        setTimeout(() => {
            if (this.network.type === 'wifi') {
                console.log('we got a wifi connection, woohoo!');
            }
        }, 3000);
    });

    connectSubscription.unsubscribe();
}

【问题讨论】:

  • 请删除unsubscribe() 并重试。如果这能解决问题,我们将解决此问题。
  • @JacopoSciampi 我刚刚评论了这两行 // disconnectSubscription.unsubscribe();和 // connectSubscription.unsubscribe();但它仍然不起作用。
  • 好的,谢谢。现在,让他们发表评论。谁调用函数ionViewDidLoad()
  • ionViewDidload() 是 ionic 应用程序的函数。这意味着它将在打开应用程序时打开其中的任何功能。我还尝试从 ionviewdidload 创建一个函数,但仍然没有任何进展。
  • 这可能是一个愚蠢的问题,但你确定这个函数被调用了吗?您是否尝试在this.getWarrentsNumber(); 处设置断点以查看代码是否到达?

标签: angular typescript ionic-framework


【解决方案1】:

这是插件官方github repo的引用

在线事件在之前未连接的设备收到 网络连接以允许应用程序访问 Internet。它 依赖与连接 API 相同的信息,并在 connection.type 从 NONE 更改为任何其他值。

如您所见,onConnect 只会在之前未连接的设备收到网络连接时发出一些东西。

要在启动时检查设备是否在线,您可以直接检查this.network.type

或者

您可以创建一个服务来处理所有这些

@Injectable()
export class MyNetworkService implements OnInit {
  public connection: BehaviorSubject<string> = new BehaviorSubject(null);
  constructor(private network: Network, private platform: Platform) {

    this.connection = this.network.type;
    this.platform.ready().then(() => {
      this.network.onConnect().subscribe(() => {
        this.connection = 'something';
      });
      this.network.onDisconnect().subscribe(() => {
        this.connection = 'none';
      });
    });
  }

  ngOnInit() {
    this._setCurrentConnectionType();

    this.platform.ready().then(() => {
      this.network.onConnect().pipe(timer(3000)).subscribe(this._onConnectHandler);
      this.network.onDisconnect().pipe(timer(3000)).subscribe(this._onDisconnectHandler);
    });
  }

  private _onConnectHandler= () => this.connection.next(this.network.type);

  private _onDisconnectHandler = () => this.connection.next('offline');
}

然后您可以在任何地方注入您的服务并订阅连接。

constructor(private myNetworkService: MyNetworkService) {
  this.myNetworkService.connection.subscribe(type => {
    // you might filter out nulls
    // Before subscribe add .pipe(filter(type => type !== null))
  })

}

【讨论】:

  • 我不仅需要在启动时检查连接,我还需要在几页中检查连接......而且当用户获得连接时,他会看到一个 toast 消息,表明连接是否正常。这就是重点。
  • 有了行为主题,你甚至可以做 myNetworkService.connection.getValue() 或订阅任何你想要的地方。不管是初创公司还是一些嵌套组件
【解决方案2】:

将您的变量connectSubscriptiondisconnectSubscription 声明为类属性,然后尝试在ioniViewWillLeave() 挂钩而不是ionViewDidLoad() 中使用unsubscribe() 它们。 所以代码看起来类似于以下 -

connectSubscription: any;
disconnectSubscription: any;

ionViewDidLoad() {
    this.getWarrentsNumber();
    this.disconnectSubscription = this.network.onDisconnect().subscribe(() => {
        console.log('network was disconnected :-(');
    });

    this.connectSubscription = this.network.onConnect().subscribe(() => {
        console.log('network connected!');
        setTimeout(() => {
            if (this.network.type === 'wifi') {
                console.log('we got a wifi connection, woohoo!');
            }
        }, 3000);
    });
}

ioniViewWillLeave() {
    this.disconnectSubscription.unsubscribe();
    this.connectSubscription.unsubscribe();
}

【讨论】:

    【解决方案3】:

    该代码可以正常工作,但它可以工作依赖于 android 或 ios 等平台。我认为它可能无法控制浏览器上的任何内容。请针对平台设备测试您的应用程序。

    否则你可以使用 ngOnInit() 代替 ionViewDidLoad();

    【讨论】:

    • 无法使用 ngOnInit() 而不是 ionVIewDidLoad();因为它不是一个角度应用程序..它的离子应用程序。
    • 您可以使用 ngOnInit() 但问题是您必须使用 OnInit 实现该类。你能看看这个stackoverflow.com/questions/43703271/… 我在我的应用程序上用 ngOnInit() 检查你的代码,它正在工作。
    • 请在使用前导入 OnInit 并使用 OnInit 实现类 // import { Component, OnInit } from '@angular/core';导出类 YourClassName 实现 OnInit { }
    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多