IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Angular Discussion :

NullInjectionError réglée autrement que dans le modèle


Sujet :

Angular

  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 777
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 777
    Par défaut NullInjectionError réglée autrement que dans le modèle
    Bonjour tout le monde,

    Après avoir laissé Angular quelques semaines, j'ai repris ce modèle pour me remettre dans le bain :
    https://www.codeproject.com/Articles...ular-7-Applica

    Ça marche, mais une chose m'intrigue : dans app.module.ts j'ai dû mettre CurrentConditionsService dans les providers, sinon j'obtenais une NullInjectionError (ou NullInjectorError ?), alors que dans le projet modèle, on ne déclare pas ça à cet endroit.

    Quelles sont les différentes façons de déclarer un service à injecter ?

    En fait, il suffit de chercher "Inject" dans la page mentionnée, et c'est expliqué, au début du service on complète la balise @Injectable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Injectable({
      providedIn: 'root'
    })
    Donc, je reformule ma question : un service peut être rendu disponible pour l'injection dans toute l'application, soit par la balise @Injectable{providedin: 'root'}, soit par sa mention dans la section providers du fichier app.module.ts

    Ces deux méthodes sont-elles équivalentes ? En existe-t-il une troisième ?

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    ..service.ts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Injectable({
      providedIn: 'root'
    })
    ...
    le fait de mettre 'root' le service est donc disponible de n'importe ou, de n'importe quel module.
    (mettre le service 'root" dans le provider d'un module A... cette instance sera donc accessible aux autres modules également)

    c'est un peu normal, un service est censé être disponible de partout, de plus, il est un singleton au niveau 'root' (est injecté la même instance aux composants et services qui le demandent)




    ** si besoin, on peut créer une instance dans un composant (ainsi l'instance sera seulement au niveau de ce composant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Component({
      ...
      providers: [MyService]})
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import {Inject} from @angular/core';
    import {MyService} from './my-service';
     
    export class ListManager{
      private listService: ListService;
     
      constructor(@Inject(ListService) listService: ListService){
          console.log('listService', listService);
      }
    }

  3. #3
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 777
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 777
    Par défaut
    Donc, si je lis bien, la réponse est oui à la première question, et non à la deuxième ?

  4. #4
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    un service: (pas besoin de module)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Injectable({
      providedIn: 'root'
    })
    export class Stored1Service {
    ....
    est équivalent à :

    via un module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      providers: [Stored1Service],
    un service:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // sans injectable
    export class Stored1Service {
    ...


    ** un 3ème ?
    pas à ma connaissance !


    ** c'est surtout la notion de singleton qu'il faut bien comprendre

  5. #5
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 777
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 777
    Par défaut
    Citation Envoyé par dukoid Voir le message
    un service: (pas besoin de module)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Injectable({
      providedIn: 'root'
    })
    export class Stored1Service {
    ....
    est équivalent à :

    via un module:
    De préférence app.module.ts, pas vrai ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      providers: [Stored1Service],
    un service:

    // sans injectable
    ou ... injectable, mais sans rien dans les parenthèses ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    export class Stored1Service {
    ...


    ** un 3ème ?
    pas à ma connaissance !


    ** c'est surtout la notion de singleton qu'il faut bien comprendre
    OK merci.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 707
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Injectable({
      providedIn: 'root'
    })
    export

    je prefere ainsi, ça veut dire accessible en root (de partout donc)

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/04/2016, 17h01
  2. Réponses: 1
    Dernier message: 08/07/2010, 16h28
  3. Contenu d'un mail autrement que dans le code
    Par Chichoulinet dans le forum Django
    Réponses: 7
    Dernier message: 31/07/2009, 18h20
  4. Réponses: 2
    Dernier message: 24/08/2006, 11h02
  5. Réponses: 3
    Dernier message: 24/07/2006, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo