servicios pasar parametros modulos entre diferencia comunicacion componentes componente angular angular2-services

modulos - pasar parametros entre componentes angular 4



¿Pueden los módulos con carga lenta compartir la misma instancia de un servicio proporcionado por su padre? (2)

Acabo de encontrar un problema con un módulo de carga diferida donde el módulo primario y el secundario requieren el mismo servicio pero crean una instancia cada uno. La declaración es idéntica para ambos, es decir

import { MyService } from ''./my.service''; ... @NgModule({ ... providers: [ MyService, ... ] });

y aquí está la configuración de enrutamiento

export parentRoutes: Routes = [ { path: '':id'', component: ParentComponent, children: [ { path: '''', component: ParentDetailsComponent }, { path: ''child'', loadChildren: ''app/child.module#ChildModule'' }, ... ]} ];

que, por supuesto, se importa en el módulo principal como

RouterModule.forChild(parentRoutes)

¿Cómo hago esto si quisiera compartir la misma instancia de servicio?


Esto debería funcionar, pero aún así sugeriría que vaya con el concepto SharedModule que contiene servicios, tuberías, directivas y componentes comunes .

Shared / SharedModule

import { NgModule,ModuleWithProviders } from ''@angular/core''; import { CommonModule } from ''@angular/common''; import { MyService } from ''./my.service''; @NgModule({ imports: [ CommonModule ], declarations: [], exports: [ CommonModule ] }) export class SharedModule { static forRoot(): ModuleWithProviders { return { ngModule: SharedModule, providers: [ MyService ] //<<<====here }; } }

AppModule

import {SharedModule} from ''./shared/shared.module''; ... @NgModule({ imports:[ BrowserModule,SharedModule.forRoot()], //<<<====here providers: [] });


Usar un forRoot , como se menciona here , es lo que probablemente necesite. El problema que está destinado a resolver está directamente relacionado con el problema que está experimentando con los módulos con carga lenta que obtienen su propio servicio.

Se explica aquí en Configurar servicios principales con forRoot , pero esa sección no explica sobre el problema de carga diferida. Eso se explica con una pequeña advertencia al final de los módulos compartidos

No especifique providers singleton para toda la aplicación en un módulo compartido. Un módulo con carga lenta que importe ese módulo compartido hará su propia copia del servicio.

@NgModule({}) class SharedModule { static forRoot() { ngModule: SharedModule, providers: [ MyService ] } } @NgModule({ import: [ SharedModule.forRoot() ] }) class AppModule {} @NgModule({ imports: [ SharedModule ] }) class LazyLoadedModule {}

Esto asegura que el módulo con carga lenta no reciba el servicio. Pero ya sea que el módulo tenga una carga lenta o no, este es el patrón que se recomienda para los servicios de toda la aplicación. Aunque debe tenerse en cuenta que si no tiene ningún módulo cargado de forma diferida, no usa el patrón forRoot y solo importa SharedModule , solo será una instancia del servicio. Pero este patrón aún debería recomendarse a seguir.

ACTUALIZAR

Supongo que me apresuré a responder sin mirar completamente la pregunta. En la pregunta, no se menciona ningún módulo compartido. Parece que el OP simplemente está tratando de agregar el servicio a @NgModule.providers tanto en el módulo de la aplicación como en el módulo secundario con carga @NgModule.providers .

En este caso, simplemente elimine el servicio de los providers módulos secundarios. No es necesario El que se agrega en el módulo de la aplicación es suficiente para que se use el niño.

Solo recuerde que los providers son para toda la aplicación (excepto en el caso problemático de esta publicación), mientras que las declarations no lo son.