Ionic-framework: Ionic V2:NavControllerのプロバイダーはありません! 解決?

作成日 2016年12月10日  ·  15コメント  ·  ソース: ionic-team/ionic-framework

イオンバージョン:( 「x」でチェックしてください)
[] 1.x
[x] 2.x

送信しています... (「x」でチェックしてください)
[x]バグレポート
[]機能リクエスト
[]サポートリクエスト=>ここではサポートリクエストを送信しないでください。httpshttp://ionicworldwide.herokuapp.com/のいずれかのチャネルを使用してください。

現在の動作:
サービスのコンストラクターへのNavControllerの挿入は、プロバイダーエラーなしで失敗します

予想される行動:
働くために

再現する手順:
このクラスはエラーをスローします(他のdep。インジェクションはエラーをスローしません)

import {Interceptor, InterceptedRequest, InterceptedResponse} from 'ng2-interceptors';
import {NavController, Platform, AlertController} from "ionic-angular";
import {Injectable, Injector} from "@angular/core";

@Injectable()
export class ServerInterceptorService implements Interceptor {

  constructor(public platform: Platform,
              public alertCtl: AlertController,
              public navCtl: NavController) {
  }

  public interceptBefore(request: InterceptedRequest): InterceptedRequest {
    // Do whatever with request: get info or edit it

    return request;
    /*
     You can return:
     - Request: The modified request
     - Nothing: For convenience: It's just like returning the request
     - <any>(Observable.throw("cancelled")): Cancels the request, interrupting it from the pipeline, and calling back 'interceptAfter' in backwards order of those interceptors that got called up to this point.
     */
  }

  public interceptAfter(response: InterceptedResponse): InterceptedResponse {
    // Do whatever with response: get info or edit it
    console.log("////////////", response)
    return response;
    /*
     You can return:
     - Response: The modified response
     - Nothing: For convenience: It's just like returning the response
     */
  }
}

上記のクラスは、app.module.tsのhttpプロバイダーを置き換えます

providers:[
    ServerInterceptorService,
    {
      provide: Http,
      useFactory: interceptorFactory,
      deps: [XHRBackend, RequestOptions, ServerInterceptorService]
    },
...]

他の依存関係は適切に注入されます。

最も参考になるコメント

@ m3l7次に試してください:

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

全てのコメント15件

https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/26によると
その言われている

これを理解するために、ViewControllerまたはNavControllerをServiceに挿入しないでください。
これは彼らの意図した目的ではありません。

次に、アプリにグローバルインターセプターを追加する方法を教えてください。これは、ユーザーに表示されるアクティブなビューを知ることに応じて機能しますか?

ビューがログインページに戻る必要があるかどうかを認識できるように、インターセプターサービスが内部ロジックに応じて何かを出力する場合、インターセプターサービスをリッスンまたはサブスクライブするように各ビューコンポーネントに指示することで、私たちの生活を複雑にしませんか?

によると
https://medium.com/coding-snippets/ionic-2-ui-alert-from-a-angular-2-service-221a2e526760#.spxbdpfz1

constructor(private app: IonicApp) {}
let alert = Alert.create({title: 'Error', message: message, buttons: ['OK']});
var nav = this.app.getActiveNav();
nav.present(alert

私のrc3では動作しません。

私はいくつかのポイントを逃しているかもしれませんが...

Angularチームまたは他の人が_これはビューコンポーネントであり、それはサービスオブジェクトである_と言っているからといって、ある種の分類固定のためにそれらを完全に分離することは役に立ちません。 それらはすべて、必要なときに相互に参照を取得できるオブジェクトであり、取得できるはずです。

さらに、抽象アプリケーションレベルのNavControllerは、単純なビュー結合クラスというよりも、オーケストレーションを行うグローバルコントローラーです。 NavControllerは「非常にコア」であるため、この設計を再考するか、一元化されたアプリ全体のサービスをIonicコアモジュールに追加することをお勧めします。

非常に簡単な汚れの回避策は、あなたのapp.component.ts内、ある素晴らしいが
@ViewChild( 'carguardNav')navCtrl:NavController
のような他のサービスプロバイダーに渡すことができます

myGlobalService.nav = this.navCtrl

プラットフォームの初期化フェーズ中に、MyGlobalServiceに依存して注入した他のサービスから取得できます。

こんにちは! ここで問題が発生していることをお詫び申し上げます。 したがって、サービスにはNavControllerがないため、NavControllerをサービスに挿入することはできません。 これは、Angular依存性注入が、どのNavControllerが参照を取得するかを認識していないため、エラーが発生することを意味します。 覚えておくべき重要なことは、これはNavControllerの中心ではなく、標準のAngularDIエラーであるということです。 ユースケースを正しく理解している場合は、イベントエミッターを使用して同じ機能を取得できます。 これは私たちの側のエラーではなく、Angular 2での依存性注入の仕組みであるため、今のところこの問題をクローズしますが、集中型アプリ全体のナビゲーションコントローラーサービスのアイデアの機能リクエストを開くことを強くお勧めします上記に言及します。 Ionicをご利用いただきありがとうございます。

実際、私は懸念される可能性のある別のソリューションを作成しました。アプリ全体のイベントを使用して、サービスからの古き良きブロードキャストイベントを意味するIoCパターンを介してビューとサービスのコンポーネントを接続し、ビューコンポーネントでそれらをサブスクライブしています。

@barocsiソリューションを投稿してもよろしいですか? 私は同じ問題に直面しています。

そのたわごとをゲッターとインジェクターで動作するように強制しました

  constructor(
    protected injector: Injector
  ) {

...

  get navCtrl(): NavController {
    return this.injector.get(NavController);
  }

@bobrosoft実用的な例はありますか? 私はあなたのコードで再び「Navcontroller用のインジェクターなし」を取得します

@ m3l7次に試してください:

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

@bobrosoftわかりました、動作します。問題は、nav.push(MyComponent)を直接呼び出すと、依存関係のループが発生するため、nav.pushをトリガーする「ルーター」サービスによってキャッチされたイベントを使用する必要があることです。 (このソリューションが機能することを期待しています)。

ionic2に、より高度なルーティングソリューションがあると便利です。基本的な401インターセプターを作成し、アプリをログインページにリダイレクトしようとしています。

ねえ@bobrosoft :これがその方法です!

コンストラクター(@Inject(Platform)プラットフォーム、@ Inject(NavController)navController){
}

これはここで説明されています: https

@mpegueroは、サービス(サービスについてですよね?)が初期の段階でインスタンス化された場合は機能せず、技術的には私の最初の回答とほぼ同じです。 私は前にそれをチェックしました。

その解決策

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

優れていますが、理想的でもありません。

Ionicのドキュメントには解決策があります。 それはうまくいきます。

Android用Outlookを入手するhttp://aka.ms/ghei36

4:44 -0400で月、2017年3月20日には、 "ウラジミールTolstikov" < [email protected] [email protected] >書きました:

@mpeguero https://github.com/mpegueroこれは、サービス(サービスについてですよね?)が初期の段階でインスタンス化された場合は機能せず、技術的には私の最初の回答とほぼ同じです。 私は前にそれをチェックしました。

その解決策

コンストラクタ(
保護されたアプリ:アプリ、
..。
navCtrl()を取得します:NavController {
this.app.getRootNav();を返します。
}

優れていますが、理想的でもありません。


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/driftyco/ionic/issues/9581#issuecomment-287701528で表示するか、スレッドをミュートしてくださいhttps://github.com/notifications/unsubscribe-auth/ABvDpy- 6mn19VUnkSbBakAj11hsdEv1zks5rnjxygaJpZM4LJvpd

それで、この問題に関する現在の解決策は何ですか? インターセプターが401または403のHttpErrorResponseステータスを取得した場合、ログアウトページを開こうとしましたが、それを機能させることができません。 本当に不可能のようです。

また、グローバルサービスがNavController注入してインスタンス化しないことも常識です。 コンポーネントがprivate navCtrl: NavControllerを使用していて、 global-function-providerも使用しているページAにいるとします。
このプロバイダーが独自のNavControllerも注入して使用している場合、それを使用してコンポーネントからプロバイダーを呼び出すと、問題が発生します。

私の意見では、そのページのnavCtrlを使用するときはいつでも、使用しているグローバル関数にパラメーターとして渡すだけです。

問題をありがとう! この問題は、元の問題に関連しないコメントを防ぐためにロックされています。 これが最新バージョンのIonicで引き続き問題になる場合は、新しい問題を作成し、テンプレートが完全に入力されていることを確認してください。

このページは役に立ちましたか?
0 / 5 - 0 評価