2017-02-23 4 views
2

나는 ionic 2 RC1로 작업 중이며 텍스트 편집기로 승화를 사용하고 있습니다. 네트워크 연결이 연결되어 있는지 확인해야합니다. 그래서이 목적을 위해 나는이 목적을 위해 이온 성 네이티브 Network을 사용하고 있습니다. 하지만 난 Network.onDisconnect() 관찰 할 수있는 문제에 직면하고있다. 내가 네트워크 연결을 확인하고 연결이 끊어진 경우 경고를 표시하는 initializeApp() 메서드를 편집했습니다. 응용 프로그램이 인터넷에 연결되지 얻을 경우 다음 코드는 경고가 두 번 표시 app.component.tsION 2 네이티브 Network.onDisconnect()를 두 번 실행 코드

showAlert(title, msg) { 
    let alert = this.alertCtrl.create({ 
     title: title, 
     subTitle: msg, 
     buttons: ['OK'] 
    }); 
    alert.present(); 
    } 

    initializeApp() { 
    this.platform.ready().then(() => { 
     // Okay, so the platform is ready and our plugins are available. 
     // Here you can do any higher level native things you might need. 
     let disconnectSubscription = Network.onDisconnect().subscribe(() => { 
     this.showAlert("Error", "No internet connection"); 
     }); 
     StatusBar.styleDefault(); 
    }); 
    } 

내가 직면하고 문제에서입니다 작성했습니다. 이 post에서 비슷한 문제가 발견되었지만 답이 없습니다. 이 점에 대해 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+0

이 문제를 해결할 수 있었습니까? – sebaferreras

+1

아니, 다른 웹 기반 프로젝트로 이동했기 때문에 해결하지 못했습니다. 나는이 문제가 프레임 워크의 새로운 릴리스에서 해결되어야한다고 생각합니다. –

답변

5

이벤트를 필터링하고 상태가 온라인에서 오프라인으로 변경되거나 오프라인에서 온라인으로 변경 될 때 수행 할 수 있습니다 (플러그인에 의해 이벤트가 실행될 때마다가 아니라) . 그래서 기본적으로 당신은이 모든 논리를 다음과 같이 처리하는 서비스를 만들 수 있습니다

import { Injectable } from '@angular/core'; 
import { Network } from 'ionic-native'; 
import { Events } from 'ionic-angular'; 

export enum ConnectionStatusEnum { 
    Online, 
    Offline 
} 

@Injectable() 
export class NetworkService { 

    private previousStatus; 

    constructor(private eventCtrl: Events) { 
     this.previousStatus = ConnectionStatusEnum.Online; 
    } 

    public initializeNetworkEvents(): void { 
     Network.onDisconnect().subscribe(() => { 
      if (this.previousStatus === ConnectionStatusEnum.Online) { 
       this.eventCtrl.publish('network:offline'); 
      } 
      this.previousStatus = ConnectionStatusEnum.Offline; 
     }); 
     Network.onConnect().subscribe(() => { 
      if (this.previousStatus === ConnectionStatusEnum.Offline) { 
       this.eventCtrl.publish('network:online'); 
      } 
      this.previousStatus = ConnectionStatusEnum.Online; 
     }); 
    } 
} 

그래서 우리의 사용자 정의 이벤트 (network:offlinenetwork:online) 연결이 진정으로 변경 (시나리오를 고정에만 해고 할 때 여러 온라인 또는 오프라인 이벤트 연결 상태가 전혀 변경되지 않은 경우 플러그인에 의해 시작됨).

그런 다음 app.component 파일에 당신은 우리의 사용자 정의 이벤트를 구독해야합니다

// Offline event 
this.eventCtrl.subscribe('network:offline',() => { 
    // ...    
}); 

// Online event 
this.eventCtrl.subscribe('network:online',() => { 
    // ...    
}); 
+0

이것은 여전히 ​​두 번 발동합니다. – Mike

+1

온라인의 많은 게시물에서이 질문에 대한 답변으로 제공되는 이러한 유형의 솔루션이 많습니다. 이것은 확실히 가장 우아한 답변입니다. 그러나 다른 솔루션이 작동하지 않는 것처럼 작동하지 않습니다 (시도했습니다). 이벤트가 동시에 여러 번 발생하거나 위의 코드보다 빠르게 실행되면 네트워크의 불필요한 이벤트를 실행 및 필터링 할 수 있습니다. – JurgenW

+0

흠 ... 나는 위의 코드를 몇 가지 응용 프로그램에서 사용하며 그 문제에 결코 직면하지 않았습니다. 플러그 인 이벤트가 매우 빨리 트리거되는 경우에도 'NetworkService'인스턴스가 하나만있는 경우 서비스 로직 @JurgenW에서 처리해야합니다. – sebaferreras

0

나는이 문제를 해결했다. 사람들이 가지고있는 진짜 문제는 많은 경우에 이온 페이지의 여러 인스턴스가 생성된다는 것입니다. 따라서 페이지에 이벤트 수신기를 등록한 다음 앱을 통해 앞뒤로 탐색을 시작하면 이벤트 수신기가 여러 번 등록됩니다.

// top of page 
import { Observable } from 'rxjs/Observable'; 

initializeApp() { 
    this.platform.ready().then(() => { 
     // Okay, so the platform is ready and our plugins are available. 
     // Here you can do any higher level native things you might need. 
     this.statusBar.styleDefault(); 
     this.splashScreen.hide(); 

     var offline = Observable.fromEvent(window, "offline"); 
     var online = Observable.fromEvent(window, "online"); 

     offline.subscribe(() => {   
      console.log('Offline event was detected.'); 
     }); 

     online.subscribe(() => { 
      console.log('Online event was detected.');   
     }) 
    }); 
    } 

두 로그 메시지는 당신이/오프라인 각각 아무리 온라인 없을 때 한 번 트리거됩니다 이 솔루션은 app.component.ts의 intializeApp 방법과 같이에서 이벤트 수신기를 추가하는 것입니다 앱 내에서 많이 이동합니다.

+0

* 따라서 페이지에 이벤트 수신기를 등록한 다음 앱을 통해 앞뒤로 탐색을 시작하면 이벤트 수신기가 여러 번 등록됩니다. * 사용자가 페이지를 떠날 때 이벤트 구독을 취소하지 않는 경우에만 해당됩니다. 잘못되었지만 플러그인과 아무 관련이 없습니다.) app.component.ts 파일이나 공유 서비스에서이 작업을 처리하는 것이 좋지만 앱의 모든 페이지에서 제대로 ** 작업을 수행하면 제대로 작동합니다. – sebaferreras

0

나는이 문제를 피하기 위해 아래 코드를 사용해야한다고 생각합니다.

import { Network } from 'ionic-native'; 

    @Injectable() 
    export class NetworkService { 
    previousStatus:any 
     constructor() { 

     }  

    showAlert(title, msg) { 
     let alert = this.alertCtrl.create({ 
      title: title, 
      subTitle: msg, 
      buttons: ['OK'] 
     }); 
     alert.present(); 
     }   
      this.initializeApp(); 
      this.network.onDisconnect().subscribe(() => { 
       if (this.previousStatus === Online) { 
        this.showAlert("Error", "No internet connection"); 
       } 
       this.previousStatus = Offline; 
      }); 
      Network.onConnect().subscribe(() => { 
       if (this.previousStatus === Offline) { 
       this.showAlert("Alert", "Network was connected"); 
       } 
       this.previousStatus = Online; 
      }); 
     } 
    }