Skip to main content

Injectable | Angular

  • Injectable | Angular

alt text

No Angular, os decoradores @Optional(), @Host(), @SkipSelf() e @Inject() são usados no contexto de injeção de dependência para controlar como e de onde os serviços são injetados nos componentes ou diretivas. Aqui está uma explicação detalhada sobre cada um deles:

1. @Optional()

  • O que faz? Indica que a dependência pode ser opcional.
  • Quando usar? Quando o serviço pode ou não estar disponível, evitando erros caso ele não esteja presente.
  • Exemplo:
    constructor(@Optional() private service: SomeService) {
    if (!service) {
    console.log('SomeService não foi encontrado.');
    }
    }
    Se SomeService não estiver registrado no provedor, o valor injetado será null em vez de lançar um erro.

2. @Host()

  • O que faz? Força o Angular a buscar a dependência apenas no componente ou diretiva hospedeira (onde a diretiva está sendo usada).
  • Quando usar? Quando você quer garantir que a dependência vem diretamente do componente/diretiva onde a injeção ocorre e não de ancestrais na hierarquia de injeção.
  • Exemplo:
    constructor(@Host() private service: SomeService) {}
    Isso impede que o Angular procure SomeService em módulos pais, garantindo que o serviço seja fornecido somente no componente hospedeiro.

3. @SkipSelf()

  • O que faz? Diz ao Angular para não buscar a dependência no próprio componente, mas sim no seu pai.
  • Quando usar? Quando um serviço pode estar registrado tanto localmente quanto em um nível superior e você quer forçar a busca no pai.
  • Exemplo:
    constructor(@SkipSelf() private service: SomeService) {}
    Isso significa que, se SomeService estiver no mesmo componente onde essa injeção ocorre, ele será ignorado, e a busca será feita no nível superior da árvore de injeção.

4. @Inject()

  • O que faz? Permite especificar manualmente um token para injeção, útil quando não é possível inferir o tipo do serviço automaticamente.
  • Quando usar? Quando o serviço usa tokens de injeção personalizados (por exemplo, valores primitivos ou classes abstratas).
  • Exemplo:
    constructor(@Inject('API_URL') private apiUrl: string) {
    console.log(`API URL: ${apiUrl}`);
    }
    Neste caso, API_URL pode ser um InjectionToken definido em outro lugar:
    import { InjectionToken } from '@angular/core';

    export const API_URL = new InjectionToken<string>('API_URL');

    @NgModule({
    providers: [{ provide: API_URL, useValue: 'https://api.example.com' }]
    })

Resumo:

DecoradorO que faz?Quando usar?
@Optional()Torna a dependência opcional (se não for encontrada, injeta null).Quando um serviço pode ou não estar disponível.
@Host()Busca a dependência apenas no componente ou diretiva hospedeira.Quando quer evitar que a dependência seja buscada em níveis superiores.
@SkipSelf()Pula o componente atual e busca a dependência no nível superior.Quando há um serviço local, mas quer usar a versão de um pai.
@Inject()Injeta manualmente um valor usando um token específico.Quando o tipo não pode ser inferido automaticamente (ex: valores primitivos, interfaces).