🔴 Live Angular le 16 octobre à 19h

Anticipez le futur avec Signal Forms d'Angular

Angular 21 introduira Signal Forms, une nouvelle API expérimentale qui simplifiera radicalement la gestion des formulaires.

Basée sur les signaux, elle permettra :

  • de créer des formulaires déclaratifs avec form()
  • de lier directement les champs avec [control]
  • d'intégrer facilement les validations et la soumission
  • et de réduire le boilerplate tout en améliorant les performances
Skip to content

Vous souhaitez recevoir de l'aide sur ce sujet ? rejoignez la communauté Angular.fr sur Discord.

Les termes de l'injection de dépendance

Dependency Injection (DI)

Définition : C’est un mécanisme qui permet à Angular de créer et fournir automatiquement les objets (services, valeurs, etc.) dont tes composants ou classes ont besoin.

Image mentale : 💡 Plutôt que de “cuisiner” toi-même ton service dans chaque composant, tu le fais livrer par Angular, qui agit comme un “serveur d’objets”.

Exemple :

ts
@Component({...})
export class UserComponent {
  private logger = inject(LoggerService); // Angular fournit le LoggerService
}

Injector (Injecteur)

Définition : Un injecteur est un objet Angular qui sait comment créer et fournir des dépendances.

Image mentale : 🧃 C’est comme une distributeur automatique : tu lui demandes un service, il te donne une instance.

Types principaux :

  • ElementInjector → lié à l’arbre des composants (DOM)
  • EnvironmentInjector → lié à l’arbre des routes et de l’application

Exemple :

ts
const logger = inject(LoggerService);

➡️ Ici, Angular demande au bon injecteur de fournir un LoggerService.


Token

Définition : Un token est une clé d’identification qui dit à Angular quelle dépendance tu veux. C’est ce que tu passes à inject() ou au constructeur.

Image mentale : 🔑 C’est la “clé” que tu insères dans le distributeur (injecteur) pour obtenir le bon objet.

Types de tokens :

  1. Une classe (souvent un service) :

    ts
    inject(LoggerService);
  2. Un InjectionToken (pour une valeur, une interface, une constante) :

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

Exemple :

ts
{ provide: API_URL, useValue: 'https://api.example.com' }

Provider

Définition : Un provider indique comment obtenir ou créer une valeur pour un token.

Image mentale : 🧰 C’est la “recette” que l’injecteur suit pour savoir comment produire le service.

Types de providers :

TypeDescriptionExemple
useClassCrée une instance d’une classe{ provide: Token, useClass: MyService }
useValueFournit une valeur simple{ provide: TOKEN, useValue: 42 }
useExistingAlias vers un autre provider{ provide: NewToken, useExisting: OldToken }
useFactoryAppelle une fonction qui retourne la valeur{ provide: TOKEN, useFactory: () => new Service() }

Exemple :

ts
providers: [
  { provide: LoggerService, useClass: LoggerService },
  { provide: API_URL, useValue: 'https://api.example.com' }
]

InjectionToken

Définition : Un objet spécial utilisé comme token pour des valeurs non classes (objets, chaînes, configs…).

Image mentale : 🔖 Un “étiquette” typée que tu crées pour qu’Angular sache quoi fournir.

Exemple :

ts
export const CONFIG = new InjectionToken<AppConfig>('CONFIG');

providers: [
  { provide: CONFIG, useValue: { apiUrl: 'https://api.example.com' } }
];

Puis :

ts
const config = inject(CONFIG);

Service

Définition : Une classe que tu veux partager et réutiliser dans ton app (souvent marquée @Injectable()).

Image mentale : 💼 Un “outil” ou une “boîte à fonctions” qu’Angular crée et partage selon ton besoin.

Exemple :

ts
@Injectable({ providedIn: 'root' })
export class LoggerService {
  log(msg: string) { console.log(msg); }
}

Inject()

Définition : Une fonction moderne (depuis Angular 14) qui demande un service à l’injecteur courant.

Image mentale : 🎯 C’est comme tendre la main et dire “Donne-moi ce service”.

Exemple simple :

ts
const logger = inject(LoggerService);

Avec options avancées :

ts
const logger = inject(LoggerService, { optional: true, self: true });

ElementInjector

Définition : Un injecteur associé à chaque composant ou directive dans le DOM. Il gère les providers déclarés localement (providers: [...] dans le décorateur).

Image mentale : 🧩 Chaque composant a sa “mini boîte à services”.

Exemple :

ts
@Component({
  selector: 'app-child',
  providers: [LoggerService]
})
export class ChildComponent {
  private logger = inject(LoggerService); // vient de ce composant
}

EnvironmentInjector

Définition : Un injecteur “global” lié à l’application et aux routes. Il contient les services fournis dans :

  • ApplicationConfig.providers
  • Route.providers
  • ou via providedIn: 'root'

Image mentale : 🌐 C’est la “boîte à services” partagée par toute une partie de ton app (ou toute l’app).

Exemple :

ts
bootstrapApplication(AppComponent, {
  providers: [
    provideRouter(routes),
    { provide: LoggerService, useClass: LoggerService }
  ]
});

Hierarchical Injectors

Définition : C’est la manière dont Angular organise les injecteurs en arborescence. Les ElementInjector sont dans l’arbre des composants, les EnvironmentInjector dans l’arbre des routes.

Image mentale : 🌳 Angular a deux arbres qui coopèrent :

  • l’arbre des composants (Element Injectors)
  • l’arbre des environnements (Environment Injectors)

Angular cherche toujours du plus proche au plus haut.


Scope / Portée

Définition : La “zone de vie” d’un service — où et quand il est partagé.

Exemples :

ScopeCréationDurée de vie
Composantproviders dans le décorateurdétruit avec le composant
Routeproviders dans la routepersiste tant que la route est chargée
ApplicationprovidedIn: 'root'vie de l’app entière

APP_INITIALIZER / provideAppInitializer

Définition : Une façon d’exécuter du code avant que l’application ne démarre.

Image mentale : ⏳ “Avant d’ouvrir la boutique, prépare les étagères.”

Exemple moderne (Angular 19+):

ts
provideAppInitializer(() => inject(ConfigService).load());

runInInjectionContext()

Définition : Permet d’exécuter du code dans le contexte d’un injecteur donné. C’est utile pour utiliser inject() en dehors des composants (ex : dans des fonctions utilitaires).

Exemple :

ts
runInInjectionContext(envInjector, () => {
  const service = inject(LoggerService);
  service.log('Contexte d’injection manuel');
});

NullInjector

Définition : L’injecteur “vide” — c’est le dernier recours. Si aucun injecteur au-dessus n’a le service demandé → il renvoie une erreur.

Image mentale : 🚫 Le “fond du puits” : si tu arrives là, Angular te dit “Service introuvable !”.