6

cordova-plugin-network-information を使用して Ionic2 アプリを開発しています。app.ts から接続および切断イベントをサブスクライブしており、NavController への参照と Loading コンポーネントをサブスクライブに渡すことができるようにしたいと考えています。 () コールバックを使用しているため、切断のイベントが発生するたびに、UI の上に Loading オーバーレイをユーザーに表示できます。コールバックで、「this」オブジェクトへの参照が「SafeSubscriber」というオブジェクトに変更されていることがわかります。これは、Observer オブジェクトの rxjs 型付きクラスだと思います。ここでの問題は、それらを取得する方法がないことです。 App オブジェクト自体にアクセスするために、Chrome DevTools を使用して app.ts でこのコードにインスタンスを使用できます。

これが私のコードです:

    ngOnInit()
    {
      // Nav Controller:
      this.nav = <NavController>this.app.getComponent('nav');

      // Disconnect Detection
      let disconnectSubscription = Network.onDisconnect().subscribe(() =>
      {
          console.log('Disconnect Detected');
          // Push Loading into nav stack here...!
          // this.nav.present(this.loading);  <- no this object...
      });
    }

これは、Chrome DevTools 内で「this」オブジェクトを照会したときに得られるものです (これは、元のコンテキストをラムダ [太い矢印] 関数内に保持することになっていますが、これは正しいですか?)

ここに画像の説明を入力

サブスクリプションを実行する前に「その」オブジェクトを設定しようとしましたが、変数「これ」がコールバックの「この」スコープに干渉しないようにしましたが、このシナリオでは機能しませんでした。「それ」はすぐに宣言されたためですsubscribe() (let that: any = this;) の前は、切断イベントが発生したときにコールバック内で未定義でした。

これは、UI を直接変更するコードを配置するのに最適な場所ではないことはわかっていますが、ここで必要なのは、接続が検出されず、ユーザーがアプリ内の特定のページを表示しています。

これには非常に簡単でエレガントな解決策があるはずですが、見つけられないようです。subscribe() 関数にパラメーターを渡す方法はありますか? 私が必要とする参照を持つある種のオブジェクト?

前もって感謝します。

4

4 に答える 4

1

単純なクロージャーでうまくいくと確信しています。これを試して:

ngOnInit()
    {
      // Nav Controller:
     var nav = <NavController>this.app.getComponent('nav');

      // Disconnect Detection
      let disconnectSubscription = Network.onDisconnect().subscribe(() =>
      {
          console.log('Disconnect Detected');          
          nav.present(true);  
      });
    }
于 2016-07-24T04:05:42.497 に答える
1

サブスクライブ内でコンポーネント変数オブジェクトを渡すには、combineLatest などの rxjs 演算子をさらに使用する必要があります。subscribe 内で渡したいオブジェクトの新しい Observable を作成し、それを CombineLatest の引数として作成するだけです。例えば。

    // Note: The **of** here is the rxjs of operator to create the observable. 
    combineLatest(
         [
            of(the object you want to pass{Here you will have the this variable}), 
            your API call
         ])
        .pipe(take(1),)
        .subscribe(([yourObject, apiResponse]) => {
            console.log(yourObject + " " + apiResponse);
         });

これが私の最終的な答えを見つけた参照です。

于 2020-10-01T05:13:02.413 に答える