Al generar servicios en la CLI angular, está agregando metadatos adicionales con una propiedad 'proporcionada en' con un valor predeterminado de 'raíz' para el decorador inyectable.
@Injectable({
providedIn: 'root',
})
¿Qué hace exactamente provideIn? Supongo que esto está haciendo que el servicio esté disponible como un servicio singleton de tipo 'global' para toda la aplicación, sin embargo, ¿no sería más limpio declarar tales servicios en la matriz de proveedores del AppModule?
ACTUALIZAR:
Para cualquier otra persona, el siguiente párrafo también proporcionó otra buena explicación, en particular si desea brindar su servicio solo a un módulo de funciones.
Ahora hay una nueva forma recomendada de registrar un proveedor, directamente dentro del
@Injectable()
decorador, utilizando el nuevoprovidedIn
atributo. Acepta'root'
como valor o cualquier módulo de su aplicación. Cuando lo use'root'
,injectable
se registrará como un singleton en la aplicación, y no necesita agregarlo a los proveedores del módulo raíz. Del mismo modo, si lo usaprovidedIn: UsersModule
,injectable
se registra como un proveedor de laUsersModule
sin agregarlo a laproviders
del módulo. "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
ACTUALIZACIÓN 2:
Después de una investigación más profunda, he decidido que solo es útil tener providedIn: 'root'
Si desea provide
un servicio en cualquier módulo que no sea el módulo raíz, es mejor que use la providers
matriz en los decoradores del módulo de funciones, de lo contrario, estará plagado de dependencias circulares. Discusiones interesantes que se tendrán aquí - https://github.com/angular/angular-cli/issues/10170
Respuestas:
si usa "provideIn", el inyectable se registra como proveedor del Módulo sin agregarlo a los proveedores del módulo.
De
Docs
fuente
providedIn
atributo para definir dónde se debe inicializar el servicio al usar el@Injectable()
decorador. Luego, debe eliminarlo del atributo de proveedores de suNgModule
declaración, así como de su declaración de importación. Esto puede ayudar a reducir el tamaño del paquete eliminando el código no utilizado del paquete.providedIn: 'root'
es la forma más fácil y eficiente de proporcionar servicios desde Angular 6:Para obtener más información, considere leer la documentación y las preguntas frecuentes de NgModule
Por cierto:
providers
matriz de NgModule en su lugar.fuente
De documentos
Marca una clase como disponible para Injector para su creación.
El servicio en sí es una clase que la CLI generó y que está decorada con @Injectable ().
Determina qué inyectores proporcionarán el inyectable, ya sea asociandolo con un @NgModule u otro InjectorType, o especificando que este inyectable se debe proporcionar en el inyector 'raíz', que será el inyector de nivel de aplicación en la mayoría de las aplicaciones.
Cuando proporciona el servicio en el nivel raíz, Angular crea una única instancia de servicio compartida y la inyecta en cualquier clase que lo solicite. El registro del proveedor en los metadatos @Injectable () también permite a Angular optimizar una aplicación al eliminar el servicio de la aplicación compilada si no se utiliza.
También es posible especificar que se debe proporcionar un servicio en un @NgModule particular. Por ejemplo, si no desea que un servicio esté disponible para las aplicaciones a menos que importen un módulo que haya creado, puede especificar que el servicio se brinde en el módulo
Se prefiere este método porque permite la sacudida del árbol (la sacudida del árbol es un paso en un proceso de compilación que elimina el código no utilizado de una base de código ) del servicio si nada lo inyecta.
Si no es posible especificar en el servicio qué módulo debe proporcionarlo, también puede declarar un proveedor para el servicio dentro del módulo:
fuente
@Injectable()
?provideIn le dice a Angular que el inyector raíz es responsable de crear una instancia de su Servicio. Los servicios que se brindan de esta manera se ponen automáticamente a disposición de toda la aplicación y no es necesario enumerarlos en ningún módulo.
Las clases de servicio pueden actuar como sus propios proveedores, por lo que definirlas en el decorador @Injectable es todo el registro que necesita.
fuente
De acuerdo con el
Documentation
:fuente