Je pense que les réponses sont bonnes mais je pense qu'il manque quelque chose.
Ce qui manque, c'est "pourquoi et qu'est-ce que ça résout ?".
Ok, commençons.
Tout d'abord, mentionnons quelques informations :
Tous les modules ont accès aux services de la racine.
Ainsi, même les modules chargés paresseusement peuvent utiliser un service qui a été fourni en app.module
.
Que se passera-t-il si un module chargé paresseusement se fournit un service que le module d'application a déjà fourni ? 2 instances.
Ce n'est pas un problème mais parfois c'est .
Comment pouvons-nous résoudre ce problème ? Il suffit de ne pas importer un module avec ce fournisseur pour les modules chargés paresseusement.
Fin de l'histoire.
Ce ^ était juste pour montrer que les modules chargés paresseusement ont leur propre point d'injection (par opposition aux modules non chargés paresseusement).
Mais que se passe-t-il lorsqu'un partagé( !) a déclaré providers
et ce module est importé par lazy et app.module
? Encore une fois, comme nous l'avons dit, deux cas.
Comment pouvons-nous résoudre ce problème dans le cadre du module partagé ? pas à utiliser providers:[]
! Pourquoi ? parce qu'ils seront importés automatiquement dans consuming lazy et app.module et nous ne voulons pas cela car nous avons vu que chacun aura une instance différente.
Eh bien, il s'avère que nous pouvons déclarer un module partagé qui n'aura pas de providers:[]
mais quand même, fournira des prodiges ( désolé :))
Comment ? Comme ceci :
Avis, aucun fournisseur.
Mais
-
que se passera-t-il maintenant lorsque app.module importera le module partagé avec le POV de service ? RIEN.
-
que se passera-t-il maintenant lorsqu'un module paresseux importera le module partagé avec le point de vue du service ? RIEN.
Entrée du mécanisme manuel par convention :
Vous remarquerez que les fournisseurs figurant sur les photos ont service1
et service2
Cela nous permet d'importer service2
pour les modules chargés paresseusement et service1
pour les modules non-lazy. ( toux...routeur....cough )
BTW, personne ne vous empêche d'appeler. forRoot
dans un module paresseux, mais vous aurez 2 instances car app.module
devrait également le faire - donc Ne le fais pas. le faire en modules paresseux.
Aussi - si app.module
appelle forRoot
( et personne n'appelle forchild
) - c'est très bien, mais l'injecteur Root n'aura que service1
. ( disponible pour toutes les applications)
Alors pourquoi en avons-nous besoin ? Je dirais :
Il permet à un module partagé, d'être capable de divisé son différents fournisseurs à utiliser avec des modules avides et des modules paresseux. via forRoot
et forChild
convention. Je répète : convention
C'est tout.
ATTENDRE ! !! pas un seul mot sur singleton ? ? alors pourquoi est-ce que je lis singleton partout ?
Eh bien - c'est caché dans la phrase ci-dessus ^.
Il permet à un module partagé, d'être capable de divisé son différents fournisseurs à utiliser avec des modules avides et des modules paresseux. via pourRoot et pourChild .
Le site convention ( !!!) lui permet d'être singleton - ou pour être plus précis - si vous ne suivez pas la convention - vous serez PAS obtenir un singleton.
Donc si vous ne chargez que forRoot
dans le app.module
alors vous n'obtiendrez qu'une seule instance car vous ne devez appeler que forRoot
dans le app.module
.
BTW - à ce stade, vous pouvez oublier de forChild
. le module chargé paresseusement ne devrait pas / ne veut pas appeler forRoot
- donc vous êtes en sécurité dans le POV du singleton.
forRoot et forChild ne sont pas un seul paquet insécable - c'est juste qu'il n'y a pas de raison d'appeler Root qui ne sera évidemment chargé que dans l'application app.module
sans donner la possibilité aux modules paresseux d'avoir leurs propres services, sans créer de nouveaux services qui devraient être des squelettes.
Cette convention vous donne une belle capacité appelée forChild
- pour consommer des "services uniquement pour les modules chargés paresseusement".
Voici une démonstration Les fournisseurs de racines donnent des chiffres positifs, les modules chargés paresseusement donnent des chiffres négatifs.
1 votes
Pourriez-vous être plus précis sur ce que vous ne comprenez pas ? La citation que vous avez incluse vous dit littéralement quelle est la différence.
3 votes
Je ne comprends pas l'intérêt d'utiliser .forChild(). Quand voudrais-je avoir les directives et les routes sans le service ? En attendant, veuillez répondre à la question que vous avez supprimée du message...
39 votes
Il ne devrait y avoir qu'un seul
RouterService
pour une seule application Angular2.forRoot
va initialiser ce service et l'enregistrer auprès de DI avec une configuration de route, tandis queforChild
ne fera qu'enregistrer des configurations de route supplémentaires et indiquera à Angular2 de réutiliser la configuration de la route.RouterService
queforRoot
a créé.0 votes
@HarryNinh : Merci - c'est ce que je cherchais. Mais quand voudriez-vous enregistrer des itinéraires supplémentaires en dehors de l'enregistrement initial ? Cela semble un peu idiot. Je suppose qu'il n'y a aucun moyen de créer des routes de manière dynamique.
0 votes
@VSO suivez le tutoriel Angular 2 sur les modules et vous verrez exactement pourquoi : angular.io/docs/ts/latest/guide/ngmodule.html . "veuillez répondre à la question que vous avez supprimée du message" - non, pour la même raison que je l'ai enlevé.
0 votes
Le document est très clair sur l'objectif de
forChild
c'est pour submodules et submodules chargés paresseusement .1 votes
Voir este par l'auteur du routeur angulaire, Victor.
0 votes
Il existe une vidéo pour cela. youtube.com/watch?v=puscOjMyouc