66 votes

Quel est l'intérêt d'utiliser forRoot dans NgModule ?

Quel est l'intérêt d'utiliser forRoot dans NgModule ?

Est-ce la même chose que les fournisseurs dans AngularJS 1.x ?

Comment joue-t-il un rôle important dans le chargement paresseux ?

TIA.

0 votes

0 votes

Un article expliquant l'exemple concret est disponible à l'adresse suivante shashankvivek-7.medium.com/

57voto

JBoothUA Points 1000

Il s'agit des singletons. Les services Angular sont chargés sur la page une seule fois (singleton) et toutes les références renvoient à cette instance.

Il y a un risque qu'un module chargé paresseusement essaie de créer une deuxième instance de ce qui devrait être un singleton, et la méthode forRoot() est un moyen de s'assurer que le module d'application / le module partagé / et tout module chargé paresseusement utilisent tous la même instance (l'instance Root).

Plus d'informations copiées sur : Fournir un module de services singleton dans Angular 2

La meilleure approche consiste à créer un module avec des fournisseurs. Gardez à l'esprit que si votre service se trouve dans un module partagé, vous pouvez obtenir plusieurs instances de ce service. La meilleure idée est alors de configurer le module avec Module.forRoot.

Par convention, la méthode statique forRoot fournit et configure des services en même temps. Elle prend un objet de configuration de service et renvoie un ModuleWithProviders.

Appeler forRoot uniquement dans le module d'application racine, AppModule. L'appeler dans tout autre module, en particulier dans un module chargé paresseusement, est contraire à l'intention et est susceptible de produire une erreur d'exécution.

N'oubliez pas d'importer le résultat ; ne l'ajoutez pas à une autre liste @NgModule.

EDIT - J'AI TROUVÉ PLUS D'INFORMATIONS SUR LES DOCS ANGULAR EN CE QUI CONCERNE LA QUESTION DE CODY DANS LES COMMENTAIRES .

Si un module fournit à la fois le fournisseur

C

I'

I

1 votes

W

1 votes

A

4 votes

I T

9voto

Shashank Vivek Points 3858

ForRoot()

forRoot() est utilisé lorsque nous voulons maintenir une instance unique (singleton) d'un service à travers l'application qui aura également des modules chargés paresseusement.

Pour donner un exemple, regardez ce code de démonstration où le compteur se comporte différemment pour les modules chargés avec empressement et paresseusement.

Le compteur est maintenu par un CounterService qui réside sous SharedModule . Puisque les modules chargés paresseusement créent leur propre instance de service, nous perdons la notion de "service". singleton comportement des services Angular.

Pour y remédier, nous devons introduire le concept de forRoot() . L'exemple de travail peut être vu ici dans cette démonstration . C'est la même raison pour laquelle nous l'utilisons avec RouterModule pour aider RouterService comprendre le comportement de l'application avec plusieurs modules.

RouterModule.forRoot(ROUTES)

Si vous voulez un exemple concret de comment et où nous pouvons le mettre en œuvre, alors cet article vous aidera certainement

5voto

Sajeetharan Points 108195

F docs

f

Y here

5voto

Saeb Panahifar Points 179

Il y a deux voies pour créer un module de routage :

RouterModule.forRoot(routes)

crée un module de routage qui comprend les directives du routeur, la configuration de l'itinéraire et le service du routeur

RouterModule.forChild(routes)

crée un module de routage qui comprend les directives du routeur, la configuration de l'itinéraire mais pas les service de routeur. La méthode RouterModule.forChild() est nécessaire lorsque votre application comporte plusieurs modules de routage.

Rappelez-vous que le service routeur se charge de la synchronisation l'état de notre application et l'URL du navigateur. L'instanciation de plusieurs services de routeur qui interagissent avec la même URL de navigateur entraînerait des Il est donc essentiel qu'il n'y ait qu'une seule instance du service service de routage dans notre application, quel que soit le nombre de modules de routage que nous importons dans notre application.

Lorsque nous importons un module de routage créé à l'aide de RouterModule.forRoot(), Angular instancie le service de routage. Lorsque nous importons un module de routage créé à l'aide de la méthode RouterModule.forChild(), Angular n'instanciera pas le service de routeur service.

Par conséquent, nous ne pouvons utiliser RouterModule.forRoot() qu'une seule fois et utiliser RouterModule.forChild() plusieurs fois pour les modules de routage supplémentaires.

0voto

Nandha King Points 14

ForRoot() sera utilisée pour injecter les fournisseurs au début de l'application. Les instances de Component et de directive sont créées à chaque fois qu'elles sont invoquées. Lorsque vous mentionnez la même chose à la racine de l'application (en utilisant forRoot()), une seule instance sera créée.

Tout d'abord, nous devons comprendre que les fournisseurs sont injectés avec une certaine différence par rapport aux composants et aux directives. Lorsqu'une classe est annotée avec @Injectable, une seule instance de cette classe sera créée lors de l'appel et sera partagée par l'ensemble de l'application. Pour ce faire, nous devons ajouter la méthode this(forRoot()) lorsque la classe est importée dans NgModule.

J'espère que tout est clair maintenant.

0 votes

Si j'ajoute providedIn : root ne pensez-vous pas que cela fait la même chose ?

1 votes

@PardeepJain en retard, mais oui. providedIn est la méthode préférée en raison de l'agitation de l'arbre, qui supprimera les fournisseurs inutilisés lors de la compilation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X