web-dev-qa-db-fra.com

Quel est le but d'utiliser forRoot dans NgModule?

Quel est le but d'utiliser forRoot dans NgModule?

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

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

TIA.

28
Mantu Nigam

Cela a à voir avec les singletons. Angular angular) les services sont chargés sur la page 1 fois (singleton) et toutes les références renvoient à cette 1 instance.

Il y a un risque qu'un module chargé paresseux tente de créer une 2e instance de ce qui devrait être un singleton, et la méthode forRoot () est un moyen de garantir que le module d'application/module partagé/et tout module chargé paresseux utilisent tous la même méthode. même 1 instance (l'instance racine).

Plus d’informations copiées à partir de: Fournit le module de services de base singleton dans Angular 2

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

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

Appelez pourRoot uniquement dans le module d'application racine, AppModule. L'appeler dans un autre module, en particulier dans un module chargé paresseux, est contraire à l'intention et est susceptible de générer une erreur d'exécution.

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

EDIT - TROUVE PLUS D'INFORMATIONS SUR LES ANGULAR DOCS CONCERNANT LA QUESTION DE CODY DANS LES COMMENTAIRES ..

Si un module fournit à la fois des fournisseurs et des déclarations (composants, directives, canaux), le charger dans un injecteur enfant, tel qu'une route, dupliquerait les instances de fournisseur. La duplication des fournisseurs poserait des problèmes, car ils masqueraient les instances racine, qui sont probablement censées être des singletons. Pour cette raison, Angular permet de séparer les fournisseurs du module afin que le même module puisse être importé dans le module racine avec les fournisseurs et les modules enfants sans fournisseurs.

Créez une méthode statique pour Root () (par convention) sur le module. Placez les fournisseurs dans la méthode forRoot comme suit. Pour rendre cela plus concret, considérons le RouterModule à titre d'exemple. RouterModule doit fournir le service Routeur, ainsi que la directive RouterOutlet. RouterModule doit être importé par le module d'application racine pour que l'application dispose d'un routeur et que l'application ait au moins un routeur. Il doit également être importé par les composants de route individuels afin qu'ils puissent placer les directives RouterOutlet dans leur modèle pour les sous-routes.

Si RouterModule n’avait pas forRoot (), chaque composant de route instancierait une nouvelle instance de routeur, ce qui romprait l’application car il ne pouvait y avoir qu’un seul routeur. Pour cette raison, RouterModule a la déclaration RouterOutlet afin qu'elle soit disponible partout, mais le fournisseur de routeur se trouve uniquement dans forRoot (). Il en résulte que le module d'application racine importe RouterModule.forRoot (...) et obtient un routeur, alors que tous les composants de routage importent RouterModule, qui n'inclut pas le routeur.

Si vous avez un module fournissant à la fois des fournisseurs et des déclarations, utilisez ce modèle pour les séparer.

29
JBoothUA

À partir de docs

forRoot crée un module contenant toutes les directives, les itinéraires donnés et le service de routeur lui-même.

Vous pouvez en savoir plus sur pourquoi est-il utilisé depuis here

4
Sajeetharan - MSFT

forRoot () sera utilisé pour injecter les fournisseurs en haut de l'application. Les instances de Component et directive sont créées à chaque fois qu’elles sont appelées. Lorsque vous mentionnez la même chose à la racine de l'application (à l'aide de forRoot ()), une seule instance est créée.

Premièrement, nous devons comprendre que les fournisseurs reçoivent une différence par rapport aux composants et aux directives. Lorsqu'une classe est annotée avec @Injectable, une seule instance de cette classe est créée à l'appel et est partagée dans toute l'application. Pour ce faire, nous devons ajouter cette méthode (forRoot ()) lorsque la classe est importée dans NgModule.

J'espère que vous êtes clair maintenant.

0
Nandha King

Il y a deux façons de créer un module de routage:

RouterModule.forRoot(routes)

crée un module de routage qui inclut les directives de routeur, la configuration de la route et le service de routeur

RouterModule.forChild(routes)

crée un module de routage qui inclut les directives du routeur, la configuration de la route mais pas le service du routeur. La méthode RouterModule.forChild () est nécessaire lorsque votre application dispose de plusieurs modules de routage.

N'oubliez pas que le service de routeur assure la synchronisation entre 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 posait problème, il est donc essentiel qu’il n’y ait qu’une instance du service de routeur 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 instanciera le service de routeur. Lorsque nous importons un module de routage créé à l'aide de RouterModule.forChild (), Angular n’instanciera pas le service de routeur.

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

0
Saeb Panahifar