2016-05-09 3 views
3

私はcordio-plugin-network-informationを使用してIonic2 Appを開発しています。私はapp.tsからconnectイベントとdisconnectイベントを購読しており、NavControllerとLoadingコンポーネントへの参照をsubscribe()コールバックは、切断のイベントが発生するたびにUI上部にLoadingオーバーレイを表示することができます。コールバックでは、 "this"オブジェクトへの参照が "SafeSubscriber"というオブジェクトに変更されていることがわかります。これはObserverオブジェクトのrxjs型クラスであると思いますが、ここで問題になるのは、 app.tsで利用可能なインスタンスをコールバック内のこのコードにChrome DevToolsを使用するAppオブジェクト自体にアクセスするために、このコンテキストから私の道を見つけることができませんでした。ここでrxjs subscribe()コールバック関数にオブジェクトを渡す方法は?

は私のコードです:

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... 
     }); 
    } 

これはクロームデベロッパーツール内の「この」オブジェクト(これは、ラムダの内側に元のコンテキストを維持することになっている[脂肪矢印]機能を照会するときに私が得るものですこの正しい?)私は、オブジェクト変数は「この」コールバックで「この」スコープを干渉しないように、サブスクリプションを行う前に、それがなかった「ということ」ではない設定を試してみました

enter image description here

このシナリオでは、 'それ' hは、切断イベントが発生したときに、subscribe()(let:any = this;)がコールバックの内部で未定義になる直前に宣言されました。

これはUIを直接変更するコードを置くのに最適な場所ではないが、私はここに必要なのは接続がないときにこのオーバーレイを設定することで動作するグローバルなイベントハンドラなので、ユーザーはアプリ内の特定のページを閲覧しています。

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

ありがとうございます。

+0

間違いは別の場所です。 'this.nav ...'または 'this.loading'はこの場所でうまく動作します。 'this.loading'は' subscribe(...) 'コールバックが呼び出されたときに実際に値を持っていますか? –

+0

両方のオブジェクトがコールバックの外部で利用可能です。アプリのライフタイムのどの時点でも実行されているようにラムダ関数の内部に問題があり、app.tsのスコープが長く消えてしまったと思います。私はこれについて完全に肯定的ではないが、クロム開発ツールでは環境はかなり孤立しているようだ。私のtsconfig.jsonはES5を使うように設定されていますが、それは問題でしょうか? –

+0

スコープは常に利用可能です。私はそれ以上の情報なしでサポートを提供するのはかなり難しいと思う。理想的には、これを再現してデバッグできるPlunkerだ。 –

答えて

0

私は、単純なクロージャがそのトリックを行うべきであると確信しています。これを試してください:

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

     // Disconnect Detection 
     let disconnectSubscription = Network.onDisconnect().subscribe(() => 
     { 
      console.log('Disconnect Detected');   
      nav.present(true); 
     }); 
    } 
1

私はこの同じ問題に遭遇しました。私はSafeSubscriberも私のプロジェクトに入れています。しかし、Plunkerを作成しようとすると、問題を再現できませんでした。つまり、添付されたプランカーは太い矢印+これが期待どおりに動作することを実証しています。したがって、はスタイル回避策を実行する必要はありません。

+0

これは私に1トンの時間を節約しました!明示的な関数(d){..}を 'subscribe'に渡したときにこの問題にぶつかりました。' this'コンテキストは 'SafeSubscriber'です。 '(d)=> {..} 'に切り替えると、正しい文脈を提供するように見えました。私は2つが同等であると思っていた! – atomic77

関連する問題