Ionic-framework: Ionic V2: Kein Anbieter für NavController! Lösung?

Erstellt am 10. Dez. 2016  ·  15Kommentare  ·  Quelle: ionic-team/ionic-framework

Ionische Version: (eine mit "x" ankreuzen)
[ ] 1.x
[x] 2.x

Ich reiche ein ... ein (eins mit "x" ankreuzen)
[ x] Fehlerbericht
[ ] Featureanfrage
[ ] Supportanfrage => Bitte stellen Sie hier keine Supportanfragen, verwenden Sie einen dieser Kanäle: https://forum.ionicframework.com/ oder http://ionicworldwide.herokuapp.com/

Aktuelles Verhalten:
Das Injizieren von NavController in den Konstruktor des Dienstes schlägt ohne Anbieterfehler fehl

Erwartetes Verhalten:
arbeiten

Schritte zum Reproduzieren:
Diese Klasse gibt einen Fehler aus (andere abhängige Injektionen geben keinen Fehler aus)

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
     */
  }
}

und die obige Klasse ersetzt den http-Anbieter in app.module.ts

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

Andere Abhängigkeiten werden ordnungsgemäß eingefügt.

Hilfreichster Kommentar

@m3l7 versuche es als nächstes:

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

Alle 15 Kommentare

Laut https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/26
es wird gesagt

Um dies zu unterstreichen, sollten Sie ViewController oder NavController nicht in Service injizieren.
Dies ist nicht ihr beabsichtigter Zweck.

Sagen Sie mir dann bitte, wie wir der App globale Interceptoren hinzufügen sollen, die sich verhalten würden, je nachdem, welche aktive Ansicht der Benutzer sieht?

Sollen wir unser Leben überkomplizieren, indem wir jeder Ansichtskomponente sagen, dass sie auf den Abfangdienst hören oder ihn abonnieren soll, wenn er abhängig von seiner internen Logik etwas ausgibt, damit die Ansicht weiß, ob sie zur Anmeldeseite zurückkehren sollte?

entsprechend
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

funktioniert bei mir nicht in rc3.

Mir fehlt vielleicht ein Punkt, aber...

Nur weil das Angular-Team oder andere sagen, dass _dies eine Ansichtskomponente und das ist ein Dienstobjekt_ ist, hilft es nicht, sie vollständig zu isolieren, nur weil eine Kategorisierungsfixierung vorgenommen wurde. All dies sind Objekte, die bei Bedarf in der Lage sein könnten und sollten, aufeinander Bezug zu nehmen.

Darüber hinaus ist NavController auf abstrakter Anwendungsebene eher ein orchestrierender globaler Controller als eine einfache View-gekoppelte Klasse. Da NavController also "so Core" ist, würde ich vorschlagen, dieses Design zu überdenken oder dem Ionic-Core-Modul einen zentralen App-weiten Dienst hinzuzufügen.

Es gibt eine sehr einfache schmutzige Problemumgehung, in Ihrer app.component.ts das Wunderbare
@ViewChild('carguardNav') navCtrl: NavController
können an andere Dienstleister weitergegeben werden wie

myGlobalService.nav = this.navCtrl

während der Plattforminitialisierungsphase und kann dann von Ihrem anderen Dienst abgerufen werden, der von MyGlobalService abhängig ist und diesen injiziert hat.

Hallo! Es tut mir leid, dass Sie hier Probleme haben. Daher kann NavController nicht in einen Dienst eingefügt werden, da ein Dienst keinen NavController hat. Dies bedeutet, dass die Angular-Abhängigkeitsinjektion nicht weiß, welcher NavController auch eine Referenz erhalten soll, was zu einem Fehler führt. Es ist wichtig, sich daran zu erinnern, dass dies nicht von zentraler Bedeutung für unseren NavController ist, sondern ein standardmäßiger Angular DI-Fehler. Wenn ich Ihren Anwendungsfall richtig verstehe, können Sie Ereignisemitter verwenden, um dieselbe Funktionalität zu erhalten. Da dies kein Fehler unsererseits ist, sondern einfach die Funktionsweise von Dependency Injection in Angular 2, werde ich dieses Problem vorerst schließen, aber ich würde dringend empfehlen, dass Sie eine Funktionsanfrage für die zentrale App-weite Navcontroller-Dienstidee öffnen, die Sie haben oben erwähnen. Vielen Dank für die Verwendung von Ionic!

Tatsächlich habe ich eine andere Lösung entwickelt, für die es vielleicht etwas gibt. Ich verwende App-weite Ereignisse, um Ansichts- und Dienstkomponenten über das IoC-Muster zu verbinden, was die guten alten Sendeereignisse von Diensten bedeutet und sie in Ansichtskomponenten abonniert.

@barocsi Macht es Ihnen etwas aus, Ihre Lösung zu

Habe diesen Scheiß gezwungen, mit Getter und Injektor zu arbeiten

  constructor(
    protected injector: Injector
  ) {

...

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

@bobrosoft hast du ein funktionierendes Beispiel? Ich bekomme wieder "kein Injektor für Navcontroller" mit Ihrem Code

@m3l7 versuche es als nächstes:

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

@bobrosoft ok, es funktioniert (in der Hoffnung, dass diese Lösung funktioniert).

es wäre toll, fortschrittlichere Routing-Lösungen in ionic2 zu haben. Ich versuche nur, einen einfachen 401-Interceptor zu erstellen und die App auf die Anmeldeseite umzuleiten

Hey @bobrosoft : So geht's!

constructor(@Inject(Plattform)-Plattform, @Inject(NavController) navController) {
}

Dies wird hier erklärt: https://github.com/driftyco/ionic/issues/5543

@mpeguero das funktioniert nicht, wenn der Dienst (wir über Dienste, oder?) Das habe ich vorher überprüft.

Diese Lösung

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

ist besser aber auch nicht optimal.

In den Ionic-Dokumenten gibt es eine Lösung. Es funktioniert gut.

Holen Sie sich Outlook für Android http://aka.ms/ghei36

Am Montag, 20. März 2017 um 4:44 AM -0400 schrieb "Vladimir Tolstikov" < [email protected] [email protected] >:

@mpeguero https://github.com/mpeguero das funktioniert nicht, wenn der Dienst (wir über Dienste, oder?) Das habe ich vorher überprüft.

Diese Lösung

Konstrukteur(
geschützte App: App,
...
get navCtrl(): NavController {
gib this.app.getRootNav() zurück;
}

ist besser aber auch nicht optimal.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/driftyco/ionic/issues/9581#issuecomment-287701528 an oder schalten Sie den Thread stumm https://github.com/notifications/unsubscribe-auth/ABvDpy- 6mn19VUnkSbBakAj11hsdEv1zks5rnjxygaJpZM4LJvpd .

Was ist also die aktuelle Lösung in dieser Angelegenheit? Ich versuche, die Logout-Seite zu öffnen, wenn der Interceptor einen HttpErrorResponse-Status von 401 oder 403 abruft, kann dies jedoch nicht zum Laufen bringen. Scheint wirklich unmöglich zu sein.

Es ist auch der gesunde Menschenverstand, dass ein globaler Dienst kein NavController injizieren und instanziieren würde. Angenommen, Sie befinden sich auf Seite A, deren Komponente private navCtrl: NavController , und sie verwendet auch global-function-provider .
Wenn dieser Anbieter nun auch sein eigenes NavController injiziert und verwendet, wird das Aufrufen des Anbieters von der Komponente, die ihn verwendet, die Dinge durcheinander bringen.

Meiner Meinung nach, wenn Sie navCtrl dieser Seite verwenden möchten, übergeben Sie es einfach als Parameter an die globale Funktion, die Sie verwenden.

Danke für das Problem! Dieses Problem wird gesperrt, um Kommentare zu verhindern, die für das ursprüngliche Problem nicht relevant sind. Wenn dies immer noch ein Problem mit der neuesten Version von Ionic ist, erstellen Sie bitte ein neues Problem und stellen Sie sicher, dass die Vorlage vollständig ausgefüllt ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

brandyscarney picture brandyscarney  ·  3Kommentare

daveshirman picture daveshirman  ·  3Kommentare

giammaleoni picture giammaleoni  ·  3Kommentare

Nick-The-Uncharted picture Nick-The-Uncharted  ·  3Kommentare

masimplo picture masimplo  ·  3Kommentare