angular - modules - ¿Cuál es el propósito de usar forRoot en NgModule?
module inside module angular 2 (4)
ForRoot () se utilizará para inyectar a los proveedores en la parte superior de la aplicación. La instancia de Componente y directiva se crea una nueva instancia cada vez que se invocan. Cuando se menciona lo mismo en la raíz de la aplicación (utilizando forRoot ()) solo se creará una instancia.
En primer lugar, debemos comprender que a los proveedores se les inyecta una diferencia que a los componentes y directivas inyectados. Cuando una clase se anota con @Injectable, solo se creará una instancia de esta clase en el momento de la llamada y se compartirá en toda la aplicación. Para hacerlo, debemos agregar este método (forRoot ()) cuando la clase se importe en NgModule.
Espero que estés claro ahora.
¿Cuál es el propósito de usar forRoot en NgModule?
¿Es lo mismo que los proveedores en AngularJS 1.x?
¿Cómo juega el papel importante en la carga perezosa?
TIA.
Hay dos formas de crear un módulo de enrutamiento:
RouterModule.forRoot(routes)
crea un módulo de enrutamiento que incluye las directivas del enrutador, la configuración de la ruta y el servicio del enrutador
RouterModule.forChild(routes)
crea un módulo de enrutamiento que incluye las directivas del enrutador, la configuración de la ruta pero no el servicio del enrutador. El método RouterModule.forChild () es necesario cuando su aplicación tiene varios módulos de enrutamiento.
Recuerde que el servicio de enrutador se encarga de la sincronización entre el estado de nuestra aplicación y la URL del navegador. La creación de múltiples servicios de enrutador que interactúan con la misma URL del navegador podría generar problemas, por lo que es esencial que solo haya una instancia del servicio de enrutador en nuestra aplicación, sin importar cuántos módulos de enrutamiento importemos en nuestra aplicación.
Cuando importamos un módulo de enrutamiento que se crea utilizando RouterModule.forRoot (), Angular creará una instancia del servicio de enrutador. Cuando importamos un módulo de enrutamiento que se crea utilizando RouterModule.forChild (), Angular no creará una instancia del servicio de enrutador.
Por lo tanto, solo podemos usar RouterModule.forRoot () una vez y usar RouterModule.forChild () varias veces para módulos de enrutamiento adicionales.
Tiene que ver con singletons. Los servicios angulares se cargan en la página 1 vez (singleton) y todas las referencias apuntan a esta instancia 1.
Existe el riesgo de que un módulo cargado perezoso intente crear una segunda instancia de lo que debería ser un singleton, y el método forRoot () es una forma de garantizar que el módulo de aplicaciones / módulo compartido / y cualquier módulo cargado perezoso utilicen todos misma instancia 1 (la instancia de la raíz).
Más información copiada de: Proporcionar el módulo de servicios principales de singleton en Angular 2
El mejor enfoque es crear módulo con proveedores. Tenga en cuenta que si su servicio está en un módulo compartido, puede obtener varias instancias de él. La mejor idea es configurar el módulo con Module.forRoot.
Por convención, el método estático forRoot proporciona y configura servicios al mismo tiempo. Toma un objeto de configuración de servicio y devuelve un ModuleWithProviders.
Llame a forRoot solo en el módulo de aplicación raíz, AppModule. Llamarlo en cualquier otro módulo, particularmente en un módulo cargado de forma perezosa, es contrario a la intención y es probable que produzca un error de tiempo de ejecución.
Recuerda importar el resultado; no lo agregue a ninguna otra lista @NgModule
EDITAR - ENCONTRAR ALGUNA MÁS INFORMACIÓN SOBRE LOS DOCUMENTOS ANGULARES EN RELACIÓN CON LA PREGUNTA DE CODY EN LOS COMENTARIOS ..
Si un módulo proporciona tanto proveedores como declaraciones (componentes, directivas, tuberías), cargarlo en un inyector secundario, como una ruta, duplicaría las instancias del proveedor. La duplicación de proveedores causaría problemas, ya que ocultaría las instancias de raíz, que probablemente estén destinadas a ser singletons. Por esta razón, Angular proporciona una manera de separar a los proveedores del módulo para que ese mismo módulo pueda importarse en el módulo raíz con proveedores y módulos secundarios sin proveedores.
Cree un método estático paraRoot () (por convención) en el módulo. Coloque los proveedores en el método forRoot de la siguiente manera. Para hacer esto más concreto, considere el RouterModule como un ejemplo. RouterModule debe proporcionar el servicio Router, así como la directiva RouterOutlet. RouterModule debe ser importado por el módulo de aplicación raíz para que la aplicación tenga un Router y la aplicación tenga al menos un RouterOutlet. También deben ser importados por los componentes de ruta individuales para que puedan colocar las directivas de RouterOutlet en su plantilla para las subrutas.
Si el RouterModule no tenía forRoot (), cada componente de la ruta crearía una instancia de un nuevo Router, lo que rompería la aplicación ya que solo puede haber un Router. Por esta razón, RouterModule tiene la declaración RouterOutlet para que esté disponible en todas partes, pero el proveedor de Router solo está en forRoot (). El resultado es que el módulo de aplicación raíz importa RouterModule.forRoot (...) y obtiene un Router, mientras que todos los componentes de la ruta importan RouterModule que no incluye el Router.
Si tiene un módulo que proporciona proveedores y declaraciones, use este patrón para separarlos.