Ionic-framework: Ionic V2 : Aucun fournisseur pour NavController ! Solution?

Créé le 10 déc. 2016  ·  15Commentaires  ·  Source: ionic-team/ionic-framework

Version ionique : (cocher une avec "x")
[ ] 1.x
[x ] 2.x

Je soumets un ... (cochez un avec "x")
[x] rapport de bogue
[ ] demande de fonctionnalité
[ ] demande d'assistance => Veuillez ne pas soumettre de demandes d'assistance ici, utilisez l'un de ces canaux : https://forum.ionicframework.com/ ou http://ionicworldwide.herokuapp.com/

Comportement actuel :
L'injection de NavController dans le constructeur de service échoue sans erreur de fournisseur

Comportement prévisible:
travailler

Étapes à reproduire :
Cette classe génère une erreur (les autres injections de dep. ne génèrent aucune erreur)

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

et la classe ci-dessus remplace le fournisseur http dans app.module.ts

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

Les autres dépendances sont correctement injectées.

Commentaire le plus utile

@m3l7 essayez ensuite :

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

Tous les 15 commentaires

Selon https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/26
c'est dit

Juste pour intervenir, vous ne devriez pas injecter ViewController ou NavController dans Service.
Ce n'est pas leur objectif.

Alors s'il vous plaît dites-moi, comment devrions-nous ajouter des intercepteurs globaux à l'application, qui agiraient en fonction de savoir quelle vue active l'utilisateur voit ?

Allons-nous trop compliquer nos vies en disant à chaque composant de vue d'écouter ou de s'abonner au service d'interception s'il émet quelque chose en fonction de sa logique interne afin que la vue sache si elle doit revenir à la page de connexion ?

selon
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

ne fonctionne pas dans rc3 pour moi.

Il me manque peut-être un point mais...

Juste parce que l'équipe Angular ou d'autres disent qu'il s'agit d'un composant de vue et d'un objet de service, les isoler totalement à cause d'une sorte de fixation de catégorisation n'aide pas. Ce sont tous des objets qui pourraient et devraient pouvoir se référer les uns aux autres en cas de besoin.

De plus, NavController au niveau de l'application abstraite est plus un contrôleur global d'orchestration qu'une simple classe couplée à une vue. Donc, puisque NavController est « tellement essentiel », je suggérerais de repenser cette conception ou d'ajouter un service centralisé à l'échelle de l'application au module de base Ionic.

Il existe une solution de contournement très simple, dans votre app.component.ts le merveilleux
@ViewChild('carguardNav') navCtrl: NavController
peut être transmis à d'autres fournisseurs de services comme

myGlobalService.nav = this.navCtrl

pendant la phase d'initialisation de la plate-forme, puis peut être récupéré à partir de votre autre service qui dépend de et a injecté MyGlobalService.

Salut! Désolé que vous ayez des problèmes ici. Donc NavController ne peut pas être injecté dans un service car un service n'a pas de NavController. Cela signifie que l'injection de dépendance angulaire ne sait pas quel NavController obtenir une référence, ce qui provoque également une erreur. Une chose importante à retenir est que ce n'est pas central à notre NavController, c'est une erreur angulaire DI standard. Si je comprends bien votre cas d'utilisation, vous pouvez utiliser des émetteurs d'événements pour obtenir la même fonctionnalité. Parce que ce n'est pas une erreur de notre part, mais simplement comment fonctionne l'injection de dépendances dans Angular 2, je vais fermer ce problème pour l'instant, mais je vous recommande fortement d'ouvrir une demande de fonctionnalité pour l'idée de service centralisé de navcontroller à l'échelle de l'application que vous mentionner ci-dessus. Merci d'avoir utilisé Ionic !

En fait, j'ai créé une autre solution pour ceux qui pourraient s'inquiéter, j'utilise des événements à l'échelle de l'application pour connecter les composants de vue et de service via le modèle IoC, ce qui signifie les bons vieux événements de diffusion des services et de m'y abonner dans les composants de vue.

@barocsi Cela vous dérange-

Forcé cette merde à travailler avec le getter et l'injecteur

  constructor(
    protected injector: Injector
  ) {

...

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

@bobrosoft avez-vous un exemple fonctionnel ? J'obtiens à nouveau "pas d'injecteur pour Navcontroller" avec votre code

@m3l7 essayez ensuite :

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

@bobrosoft ok, ça marche.. le problème c'est qu'en appelant directement nav.push(MyComponent) j'obtiens une boucle de dépendances, donc je suis obligé d'utiliser des événements interceptés par un service "routeur" qui va déclencher le nav.push (en espérant que cette solution fonctionnera).

ce serait formidable d'avoir des solutions de routage plus avancées dans ionic2.. J'essaie juste de créer un intercepteur 401 de base et de rediriger l'application vers la page de connexion

@bobrosoft : C'est la voie à suivre !

constructeur(@Inject(Platform) plate-forme, @Inject(NavController) navController) {
}

Ceci est expliqué ici : https://github.com/driftyco/ionic/issues/5543

@mpeguero qui ne fonctionnera pas si le service (nous parlons des services, n'est-ce pas?) J'ai vérifié ça avant.

Cette solution

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

c'est mieux mais pas idéal non plus.

Dans la doc Ionic, il y a une solution. Ça fonctionne bien.

Obtenez Outlook pour Android http://aka.ms/ghei36

Le lundi 20 mars 2017 à 04h44 -0400, "Vladimir Tolstikov" < [email protected] [email protected] > a écrit :

@mpeguero https://github.com/mpeguero cela ne fonctionnera pas si le service (nous parlons des services, non?) Instancié à des étapes antérieures et c'est techniquement proche de ma première réponse. J'ai vérifié ça avant.

Cette solution

constructeur(
application protégée : application,
...
get navCtrl() : NavController {
renvoie this.app.getRootNav();
}

c'est mieux mais pas idéal non plus.

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub https://github.com/driftyco/ionic/issues/9581#issuecomment-287701528 , ou coupez le fil https://github.com/notifications/unsubscribe-auth/ABvDpy- 6mn19VUnkSbBakAj11hsdEv1zks5rnjxygaJpZM4LJvpd .

alors quelle est la solution actuelle à ce sujet? J'essaie d'ouvrir la page de déconnexion si l'intercepteur récupère un statut HttpErrorResponse de 401 ou 403, mais je n'arrive pas à le faire fonctionner. Cela semble impossible, vraiment.

Il est également logique qu'un service global n'injecte pas et n'instancie pas un NavController . Supposons que vous soyez sur la page A, dont le composant utilise private navCtrl: NavController , et qu'il utilise également un global-function-provider .
Maintenant, si ce fournisseur injecte et utilise également son propre NavController , appeler le fournisseur à partir du composant qui l'utilise va gâcher les choses.

À mon avis, chaque fois que vous souhaitez utiliser le navCtrl , transmettez-le simplement en tant que paramètre à la fonction globale que vous utilisez.

Merci pour le problème ! Ce problème est verrouillé pour empêcher les commentaires qui ne sont pas pertinents pour le problème d'origine. Si le problème persiste avec la dernière version d'Ionic, veuillez créer un nouveau problème et vous assurer que le modèle est entièrement rempli.

Cette page vous a été utile?
0 / 5 - 0 notes