Typescript MyApp类中的构造函数只调用提供者一次

Typescript MyApp类中的构造函数只调用提供者一次,typescript,ionic-framework,ionic3,ionic-native,Typescript,Ionic Framework,Ionic3,Ionic Native,我需要在每一个网页,无线网络的连接状态调用。 然后使用提供者,但在MyApp(app.component.ts)构造函数中,只调用提供者(ConctivityServiceProvider)一次 app.component.ts import { ConectivityServiceProvider } from '...' import { Network } from '.....'; export class MyApp { conectivity:boolean construc

我需要在每一个网页,无线网络的连接状态调用。 然后使用提供者,但在MyApp(app.component.ts)构造函数中,只调用提供者(ConctivityServiceProvider)一次

app.component.ts

import { ConectivityServiceProvider } from '...'
import { Network } from '.....';
export class MyApp {
  conectivity:boolean
  constructor(private provider: ConectivityServiceProvider,public network: Network){
     platform.ready().then(() => {
       this.conectivity=provider.isOnline();
       // call once in all pages
       if(this.conectivity){
          //do someting
       }else //do something
     }
  }
}
提供者:

@Injectable()
export class ConectivityServiceProvider {
statusConectivity: boolean =true;
constructor(public network: Network){
     this.network.onDisconnect().subscribe(() => {
        this.statusConectivity=false;
      });
}
isOnline(){
    return this.statusConectivity;
  }
}
如果我将所有内容都放在MyApp类的提供者中,它会调用每个页面,而不是一次。 为什么只使用提供程序调用一次?

您应该检查一下

根据您的描述,loke有3个选项:

  • ionViewDidLoad-加载页面后,将运行void。此事件在创建每个页面时仅发生一次。如果页面离开但被缓存,则在后续查看时不会再次触发此事件。ionViewDidLoad事件是放置页面设置代码的好地方
  • ionViewWillEnter-当页面即将进入并成为活动页面时,将运行void
  • IONVIEWDIENTER-当页面完全进入并且现在是活动页面时,void将运行。无论是第一次加载还是缓存页面,都将触发此事件
因此,根据您的处理方法,当您断开连接时,您可以使用ionViewDidLoad检查页面的每次初始加载,或者在每次显示页面之前使用ionViewWillEnter检查页面(包括返回操作)

app.component.ts中的代码如下所示:

import { ConectivityServiceProvider } from '...'
import { Network } from '.....';

export class MyApp
{
    conectivity: boolean;

    constructor(private provider: ConectivityServiceProvider, public network: Network)
    {
        platform.ready().then(() =>
        {
        });
    }

    ionViewDidLoad()
    {
        this.conectivity = provider.isOnline();
        // call once in all pages
        if(this.conectivity)
        {
            //do someting
        }
        else //do something
        {
        }
    }

}
请试试angular的

拦截器拦截应用程序中的每个API调用。因此,在每次API调用之前,我们可以检查连接的状态并相应地处理代码

参考:

从'@angular/core'导入{Injectable};
进口{
HttpRequest,
HttpHandler,
HttpEvent,
http拦截器
}来自“@angular/common/http”;
从“rxjs/Observable”导入{Observable};
@可注射()
导出类ConctivityServiceProvider实现HttpInterceptor{
构造函数(){}
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
//检查一下是否有互联网
如果(!window.navigator.onLine){
//如果没有internet,抛出HttpErrorResponse错误
//由于抛出错误,函数将在此处终止
返回Observable.throw(新的HttpErrorResponse({error:'需要Internet.'}));
}否则{
//否则返回正常请求
下一步返回。处理(请求);
}
}
}

你应该为你的
页面提供
ConctivityServiceProvider
。ts
并在那里调用它。@distante,如果我有很多页面,我认为这不是最好的选择。使用应用程序初始化器hanks@Perfect,但我想要该服务,检查我尝试的所有页面是否都有连接,但它不起作用。
import { Injectable } from '@angular/core';
import {
    HttpRequest,
    HttpHandler,
    HttpEvent,
    HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class ConectivityServiceProvider implements HttpInterceptor {
    constructor() { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // check to see if there's internet
        if (!window.navigator.onLine) {
            // if there is no internet, throw a HttpErrorResponse error
            // since an error is thrown, the function will terminate here
            return Observable.throw(new HttpErrorResponse({ error: 'Internet is required.' }));

        } else {
            // else return the normal request
            return next.handle(request);
        }
    }
}