Ao gerar serviços na CLI Angular, ele adiciona metadados extras com uma propriedade 'fornecida em' com um padrão de 'raiz' para o decorador injetável.
@Injectable({
providedIn: 'root',
})
O que exatamente o Fornecido faz? Suponho que isso esteja disponibilizando o serviço como um serviço singleton do tipo 'global' para todo o aplicativo; no entanto, não seria mais fácil declarar esses serviços na matriz de provedores do AppModule?
ATUALIZAR:
Para qualquer outra pessoa, o parágrafo a seguir também forneceu outra boa explicação, principalmente se você deseja fornecer seu serviço apenas a um módulo de recursos.
Agora existe uma nova maneira recomendada de registrar um provedor, diretamente dentro do
@Injectable()
decorador, usando o novoprovidedIn
atributo. Ele aceita'root'
como um valor ou qualquer módulo do seu aplicativo. Ao usar'root'
, vocêinjectable
será registrado como um singleton no aplicativo e não precisará adicioná-lo aos provedores do módulo raiz. Da mesma forma, se você usarprovidedIn: UsersModule
, eleinjectable
será registrado como um provedor doUsersModule
sem adicioná-lo aoproviders
módulo. "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
ATUALIZAÇÃO 2:
Após uma investigação mais aprofundada, decidi que só é útil ter providedIn: 'root'
Se você deseja provide
um serviço em qualquer módulo que não seja o módulo raiz, é melhor usar a providers
matriz nos decoradores do módulo de recursos, caso contrário, você será atormentado por dependências circulares. Discussões interessantes a serem realizadas aqui - https://github.com/angular/angular-cli/issues/10170
Respostas:
se você usar o fornecido, o injetável é registrado como um provedor do Módulo sem adicioná-lo aos provedores do módulo.
De
Docs
fonte
providedIn
atributo para definir onde o serviço deve ser inicializado ao usar o@Injectable()
decorador. Você deve removê-lo do atributo de fornecedores da suaNgModule
declaração, bem como de sua declaração de importação. Isso pode ajudar a reduzir o tamanho do pacote removendo o código não utilizado do pacote.providedIn: 'root'
é a maneira mais fácil e eficiente de fornecer serviços desde o Angular 6:Para mais informações, considere ler a documentação e as perguntas frequentes do NgModule
Btw:
providers
matriz do NgModule.fonte
Do Documentos
Marca uma classe como disponível para o Injector para criação.
O serviço em si é uma classe gerada pela CLI e decorada com @Injectable ().
Determina quais injetores fornecerão o injetável, associando-o a um @NgModule ou outro InjectorType, ou especificando que esse injetável deve ser fornecido no injetor 'root', que será o injetor no nível do aplicativo na maioria dos aplicativos.
Quando você fornece o serviço no nível raiz, o Angular cria uma instância única e compartilhada do serviço e o injeta em qualquer classe que solicitar. O registro do provedor nos metadados @Injectable () também permite que o Angular otimize um aplicativo removendo o serviço do aplicativo compilado, se ele não for usado.
Também é possível especificar que um serviço deve ser fornecido em um @NgModule específico. Por exemplo, se você não deseja que um serviço esteja disponível para aplicativos, a menos que eles importem um módulo que você criou, você pode especificar que o serviço deve ser fornecido no módulo
Esse método é preferido porque habilita a agitação da árvore (a agitação da árvore é uma etapa de um processo de compilação que remove o código não utilizado de uma base de código ) do serviço se nada o injetar.
Se não for possível especificar no serviço qual módulo deve fornecê-lo, você também pode declarar um provedor para o serviço dentro do módulo:
fonte
@Injectable()
?fornecidoIn informa à Angular que o injetor raiz é responsável por criar uma instância do seu Serviço. Os serviços fornecidos dessa maneira são automaticamente disponibilizados para todo o aplicativo e não precisam ser listados em nenhum módulo.
As classes de serviço podem atuar como seus próprios provedores, e é por isso que defini-las no decorador @Injectable é todo o registro que você precisa.
fonte
De acordo com
Documentation
:fonte