Préparation d'entretien 100% Gratuit angularforall.com

Entretien Angular Débutant — Composants, Pipes et Routing

Angular Debutant Quiz-Angular-Debutant Composants-Standalone Directives-Ngif-Ngfor Angular-Pipes Angular-Routing Questions-Entretien-Angular Qcm-Angular Angular-Input-Output Angular-Services Cycle-De-Vie-Angular Angular-17 Front-End
Débutant 🔀 Mixte 20 questions ⏱ 15 min
📝

Entretien Angular Débutant — Composants, Pipes et Routing

20 questions sur les fondamentaux d'Angular 17 : composants standalone, @Input/@Output, directives (*ngIf, *ngFor, @if, @for), pipes natifs, services, cycle de vie et routing. Préparez votre entretien Angular.

20 questions ⏱ ~15 min Niveau Débutant

Partager

Banque de révision : les 60 questions corrigées

Voici l'intégralité des 60 questions de « Entretien Angular Débutant — Composants, Pipes et Routing », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.

  • ng create my-app
  • ng new my-app (bonne réponse)
  • angular new my-app
  • npm create angular my-app
Explication : La commande ng new mon-projet est utilisée pour créer un nouveau projet Angular. Elle fait partie de l'Angular CLI et initialise toute la structure du projet avec les fichiers de configuration nécessaires.
Assurez-vous d'avoir installé Angular CLI globalement avec npm install -g @angular/cli avant d'utiliser cette commande.

  • @NgModule
  • @Injectable
  • @Component (bonne réponse)
  • @Directive
Explication : Le décorateur @Component est utilisé pour marquer une classe comme composant Angular. Il prend un objet de configuration avec des propriétés comme selector, template ou templateUrl, et styles ou styleUrls.
Un composant est toujours associé à un template HTML et à des styles CSS.

  • {{ property }}
  • [(property)]
  • [attribut]="property" (bonne réponse)
  • (attribut)="property"
Explication : La liaison de propriété (property binding) utilise la syntaxe [attribut]="expression". Elle permet de lier une propriété du composant vers le DOM, par exemple [src]="imageUrl" ou [disabled]="isDisabled".
La liaison unidirectionnelle du composant vers le template est la plus courante. Pour la liaison inverse (template → composant), utilisez (event).

  • [value]="property" (input)="property=$event.target.value"
  • [(ngModel)]="property" (bonne réponse)
  • bindon-ngModel="property"
  • {{ property }}
Explication : La liaison bidirectionnelle [(ngModel)]="property" est un sucre syntaxique combinant la liaison de propriété [ngModel] et la liaison d'événement (ngModelChange). Elle nécessite d'importer FormsModule.
Pour utiliser ngModel, n'oubliez pas d'ajouter FormsModule aux imports de votre composant autonome ou de votre module.

  • ngShow
  • ngIf (bonne réponse)
  • ngSwitch
  • ngFor
Explication : *ngIf est une directive structurelle qui ajoute ou supprime un élément du DOM selon une condition booléenne. Si la condition est false, l'élément et ses enfants sont détruits du DOM.
Utilisez *ngIf="condition; else autreTemplate" pour afficher un template alternatif. Depuis Angular 17, vous pouvez aussi utiliser la nouvelle syntaxe @if.

  • *ngRepeat="let item of items"
  • *ngIterate="let item of items"
  • *ngFor="let item of items" (bonne réponse)
  • *ngLoop="let item of items"
Explication : La directive *ngFor="let item of items" permet d'itérer sur un tableau. Elle crée un élément DOM pour chaque élément du tableau. On peut aussi obtenir l'index avec *ngFor="let item of items; let i = index".
Pour de meilleures performances, utilisez trackBy avec *ngFor pour éviter la recréation inutile des éléments DOM.

  • @Service
  • @Autowire
  • @Inject
  • Aucun, l'injection se fait via le constructeur (bonne réponse)
Explication : L'injection de dépendances dans Angular se fait automatiquement via le constructeur. Il suffit de déclarer un paramètre avec le type du service dans le constructeur du composant. Le décorateur @Injectable() marque les services comme injectables.
Angular utilise le système d'injection de dépendances hiérarchique. Un service déclaré dans providedIn: "root" est un singleton global.

  • Les directives structurelles modifient la structure du DOM (ajout/suppression), les directives d'attribut modifient l'apparence ou le comportement (bonne réponse)
  • Les directives structurelles s'appliquent aux classes, les directives d'attribut aux méthodes
  • Il n'y a pas de différence, ce sont des synonymes
  • Les directives structurelles utilisent {{ }} et les directives d'attribut utilisent []
Explication : Les directives structurelles (*ngIf, *ngFor, *ngSwitch) modifient la structure du DOM en ajoutant, supprimant ou remplaçant des éléments. Les directives d'attribut (ngClass, ngStyle) modifient l'apparence ou le comportement des éléments existants.
Les directives structurelles sont préfixées par * dans les templates, tandis que les directives d'attribut s'utilisent entre crochets ou comme attributs normaux.

  • Utiliser @Output() dans l'enfant
  • Utiliser @Input() dans l'enfant (bonne réponse)
  • Utiliser un service global
  • Utiliser ViewChild()
Explication : Le décorateur @Input() permet à un composant enfant de déclarer une propriété qui peut recevoir des données du parent. Le parent utilise la liaison de propriété [nomInput]="valeur" dans le template pour passer la donnée.
Vous pouvez aussi utiliser des setters avec @Input() pour exécuter du code quand la valeur change.

  • Utiliser @Input() avec un callback
  • Utiliser un service avec Subject
  • Utiliser @Output() et EventEmitter (bonne réponse)
  • Utiliser une variable globale
Explication : Le composant enfant utilise @Output() monEvent = new EventEmitter<type>() pour définir un événement. Il émet avec this.monEvent.emit(valeur). Le parent écoute avec (monEvent)="handler($event)" dans le template.
Typez toujours votre EventEmitter pour bénéficier du typage TypeScript. Exemple : @Output() save = new EventEmitter<User>().

  • Une classe qui étend Component
  • Une classe qui contient de la logique métier réutilisable, décorée avec @Injectable (bonne réponse)
  • Un fichier de configuration
  • Une fonction qui retourne du HTML
Explication : Un service est une classe TypeScript décorée avec @Injectable(). Il permet d'organiser et de partager la logique métier, l'accès aux données, ou les fonctions utilitaires entre plusieurs composants.
Les services favorisent la réutilisabilité et la séparation des préoccupations (single responsibility principle).

  • constructor, init, render, destroy
  • constructor, ngOnInit, ngOnChanges, ngOnDestroy (bonne réponse)
  • create, mount, update, unmount
  • beforeCreate, created, beforeMount, mounted
Explication : Les hooks de cycle de vie principaux sont : constructor() (création de la classe), ngOnChanges() (changement des @Input), ngOnInit() (initialisation), ngDoCheck(), ngAfterContentInit(), ngAfterContentChecked(), ngAfterViewInit(), ngAfterViewChecked(), et ngOnDestroy() (nettoyage).
Placez la logique d'initialisation dans ngOnInit(), pas dans le constructeur. Le constructeur doit uniquement initialiser l'injection de dépendances.

  • Exécuter une fonction asynchrone
  • Souscrire automatiquement à un Observable ou une Promise (bonne réponse)
  • Convertir une callback en promesse
  • Rendre un composant asynchrone
Explication : Le pipe async souscrit automatiquement à un Observable ou une Promise dans le template. Il retourne la dernière valeur émise et gère automatiquement la désinscription quand le composant est détruit.
Utilisez | async pour éviter les fuites de mémoire, car vous n'avez pas à gérer manuellement la désinscription des Observables.

  • En ajoutant standalone: true dans @Component
  • En ne l'important dans aucun module
  • En utilisant la commande ng generate component --standalone
  • Les deux réponses A et C sont correctes (bonne réponse)
Explication : Un composant standalone est créé en définissant standalone: true dans le décorateur @Component. La commande ng generate component mon-comp --standalone le fait automatiquement. Les composants standalone n'ont pas besoin d'être déclarés dans un NgModule.
Depuis Angular 17, les composants standalone sont la recommandation officielle. Les applications créées avec ng new les utilisent par défaut.

  • @if, @for, @switch (bonne réponse)
  • ng-if, ng-for, ng-switch
  • , ,
  • *if, *for, *switch
Explication : Angular 17 a introduit une nouvelle syntaxe de contrôle de flux basée sur les blocs : @if, @else if, @else, @for avec @empty, et @switch avec @case et @default. Ces blocs sont plus performants que les directives structurelles traditionnelles.
La nouvelle syntaxe @for nécessite un track obligatoire pour optimiser le rendu, contrairement à *ngFortrackBy était optionnel.

  • Uniquement via le constructeur comme avant
  • En utilisant la fonction inject()
  • Les deux méthodes sont valides (bonne réponse)
  • Avec @ServiceInjector
Explication : Deux méthodes existent : l'injection traditionnelle via le constructeur constructor(private service: MonService) {}, et la nouvelle fonction inject() : private service = inject(MonService). Cette dernière permet l'injection hors des constructeurs (dans les fonctions, les services, etc.).
La fonction inject() est particulièrement utile dans les fonctions utilitaires ou les guards où vous n'avez pas de constructeur.

  • Un mécanisme qui détecte les modifications du DOM
  • Le processus par lequel Angular synchronise le modèle (composant) avec la vue (template) (bonne réponse)
  • Un outil de débogage
  • Une fonction qui surveille les requêtes HTTP
Explication : Le Change Detection est le mécanisme qui permet à Angular de mettre à jour automatiquement la vue quand l'état du composant change. Il compare les valeurs précédentes et actuelles pour déterminer ce qui doit être mis à jour dans le DOM.
Vous pouvez optimiser les performances avec ChangeDetectionStrategy.OnPush pour limiter les vérifications aux cas où les @Input() changent ou des événements se produisent.

  • (bonne réponse)
Explication : La directive <router-outlet></router-outlet> est le point d'entrée où le routeur Angular affiche le composant correspondant à la route active. C'est un placeholder qui sera remplacé par le contenu du composant routé.
Vous pouvez avoir plusieurs router-outlet nommés pour le routage imbriqué : <router-outlet name="aux"></router-outlet>.

  • router.navigate() (bonne réponse)
  • location.go()
  • window.location.href =
  • navigation.push()
Explication : Le service Router fournit la méthode navigate() pour naviguer programmatiquement : this.router.navigate(["/chemin", id]) ou this.router.navigateByUrl("/chemin").
Utilisez navigate(["/chemin"], { queryParams: { page: 1 } }) pour passer des paramètres de query string.

  • Une protection qui empêche l'accès non autorisé aux routes (bonne réponse)
  • Un composant qui garde la route
  • Un service qui sauvegarde les routes
  • Une fonction qui intercepte les requêtes
Explication : Les guards (CanActivate, CanDeactivate, Resolve, CanLoad, CanMatch) sont des fonctions ou services qui contrôlent si une route peut être activée, désactivée, ou chargée. Ils permettent l'authentification, l'autorisation, ou le chargement de données avant l'activation.
Depuis Angular 15+, les guards peuvent être des fonctions simples au lieu de classes, ce qui les rend plus légers et plus faciles à tester.

  • this.route.params.subscribe() (bonne réponse)
  • this.router.params
  • ActivatedRoute.params
  • this.route.data
Explication : Le service ActivatedRoute fournit params et paramMap comme Observables. On y souscrit pour obtenir les paramètres : this.route.params.subscribe(params => this.id = params["id"]).
Utilisez this.route.snapshot.paramMap.get("id") si vous êtes sûr que le composant ne sera pas réutilisé avec des paramètres différents.

  • ng serve compile et sert l'app en mémoire avec rechargement à chaud ; ng build génère des fichiers dans /dist (bonne réponse)
  • ng build est pour la production, ng serve pour le développement uniquement
  • ng serve est plus lent que ng build
  • Il n'y a pas de différence
Explication : ng serve compile l'application en mémoire, démarre un serveur de développement, et surveille les changements pour recharger automatiquement (live reload). ng build génère les fichiers de sortie dans le dossier dist/ sans serveur.
Utilisez ng build --prod (ou --configuration production) pour optimiser l'application pour la production (minification, tree-shaking, AOT).

  • Contient les dépendances npm du projet
  • Fichier de configuration principal pour l'Angular CLI (build, serve, test) (bonne réponse)
  • Définit les routes de l'application
  • Configure TypeScript
Explication : Le fichier angular.json est le fichier de configuration de l'Angular CLI. Il définit les différentes configurations de build, serve, test, les assets, les styles globaux, les polyfills, et les options de compilation.
Vous pouvez avoir plusieurs configurations dans angular.json (development, production, staging) et les utiliser avec --configuration.

  • ng generate pipe mon-pipe (bonne réponse)
  • Importer PipeModule
  • Étendre la classe Pipe
  • Utiliser @PipeTransform
Explication : La commande ng generate pipe mon-pipe crée automatiquement un pipe personnalisé. Le fichier généré contient une classe décorée avec @Pipe({ name: "monPipe" }) qui implémente l'interface PipeTransform avec la méthode transform(value, ...args).
Les pipes personnalisés sont utiles pour la transformation réutilisable de données dans les templates (formatage, filtrage, calculs).

  • constructor est appelé avant la création du composant, ngOnInit après que les @Input soient initialisés (bonne réponse)
  • constructor est pour les services, ngOnInit pour la vue
  • constructor est appelé après ngOnInit
  • Il n'y a pas de différence
Explication : Le constructor est appelé en premier lors de l'instanciation du composant, avant que les propriétés @Input() soient initialisées. ngOnInit est appelé après que le composant ait initialisé ses @Input() et est le bon endroit pour la logique d'initialisation dépendante des entrées.
Placez toujours la logique qui dépend des @Input() dans ngOnInit(), jamais dans le constructeur.

  • Pour accéder à un élément ou composant enfant dans la classe du composant (bonne réponse)
  • Pour transmettre des données à l'enfant
  • Pour écouter les événements de l'enfant
  • Pour détruire un composant enfant
Explication : Le décorateur @ViewChild permet d'accéder à un élément DOM, une directive ou un composant enfant depuis la classe parent. Exemple : @ViewChild(MonComponent) enfant!: MonComponent; pour appeler des méthodes sur l'enfant.
Accédez à la référence après ngAfterViewInit(), car c'est le premier hook où la vue est initialisée.

  • Le service est disponible dans toute l'application comme singleton (bonne réponse)
  • Le service n'est disponible que dans le composant racine
  • Le service est fourni par le système d'exploitation
  • Le service est automatiquement détruit
Explication : providedIn: "root" dans le décorateur @Injectable() signifie que le service est enregistré dans l'injecteur racine (root injector). Cela crée un singleton global accessible à toute l'application et optimise le tree-shaking.
C'est la façon recommandée de fournir des services depuis Angular 6+. Évitez d'ajouter manuellement les services dans providers: [] sauf besoin spécifique.

  • ngClass avec un objet ou un tableau (bonne réponse)
  • class.bind()
  • class.*ngIf
  • style.class
Explication : La directive ngClass permet d'appliquer des classes CSS conditionnellement : [ngClass]="{"active": isActive, "disabled": isDisabled}" ou avec un tableau [ngClass]="["class1", "class2"]" ou une chaîne.
Vous pouvez aussi utiliser [class.active]="isActive" pour une seule classe, ou la nouvelle syntaxe @if avec l'attribut class.

  • Charger les modules ou composants uniquement quand ils sont nécessaires (bonne réponse)
  • Un mode de rendu plus lent
  • Une technique pour optimiser les images
  • Une méthode de cache HTTP
Explication : Le lazy loading (chargement paresseux) permet de charger des parties de l'application (routes, composants) uniquement lorsque l'utilisateur y accède. Cela réduit la taille du bundle initial et améliore les performances. En Angular 17+, on utilise loadComponent: () => import("./mon.component") dans les routes.
Combine le lazy loading avec les composants standalone pour des bundles encore plus optimisés.

  • Introduction du rendu hybride (SSR + CSR) avec Deferrable Views (bonne réponse)
  • Suppression du rendu côté serveur
  • Nouveau moteur de rendu basé sur React
  • Passage obligatoire au rendu uniquement client
Explication : Angular 17 a introduit les Deferrable Views (blocs @defer) qui permettent de différer le chargement de parties du template avec différents déclencheurs (viewport, interaction, idle, timer). Combiné avec le rendu hybride, cela offre des performances améliorées pour l'expérience utilisateur.
Utilisez @defer (on viewport) { <mon-composant-lourd /> } @placeholder { <div>Chargement...</div> } pour charger un composant uniquement quand il devient visible.

  • ${variable}
  • {{ variable }} (bonne réponse)
  • {variable}
Explication : L'interpolation dans Angular utilise la syntaxe {{ expression }} (double accolades). Angular évalue l'expression et insère le résultat dans le HTML. On peut y mettre des variables, des appels de méthode ou des expressions simples.
L'interpolation est équivalente à un [textContent]="expression". Elle échappe automatiquement le HTML pour prévenir les attaques XSS.

  • (bonne réponse)
Explication : La liaison d'événement (event binding) dans Angular utilise la syntaxe (événement)="handler()". Les parenthèses indiquent un événement. On peut écouter n'importe quel événement DOM : (click), (keyup), (submit), etc.
Pour accéder à l'objet événement natif, utilisez $event : (click)="handleClick($event)".

  • Un décorateur qui organise les composants, directives, pipes et services en blocs fonctionnels (bonne réponse)
  • Un fichier de configuration JSON
  • Un type de service spécial
  • Une bibliothèque externe
Explication : Un NgModule est une classe décorée avec @NgModule() qui organise le code en blocs cohérents. Il déclare des composants (declarations), importe d'autres modules (imports), exporte des éléments (exports) et fournit des services (providers). Depuis Angular 17, les composants standalone sont préférés.
Dans les nouvelles applications Angular 17+, vous utilisez des composants standalone au lieu des NgModules. Les NgModules restent supportés pour la compatibilité ascendante.

  • Déclarer avec #maVariable sur un élément, puis l'utiliser directement dans le template (bonne réponse)
  • Déclarer avec $maVariable dans le composant
  • Utiliser le service TemplateRef
  • Utiliser @ViewChild uniquement
Explication : Une variable de template locale se déclare avec #nomVariable sur un élément HTML ou un composant. Elle crée une référence locale utilisable dans le template. Exemple : <input #nomInput> puis <button (click)="log(nomInput.value)">.
Les variables de template sont locales au template et ne sont pas accessibles directement dans la classe du composant sans @ViewChild.

  • {{ date | dateFormat }}
  • {{ date | date:"dd/MM/yyyy" }} (bonne réponse)
  • {{ date | formatDate:"dd/MM/yyyy" }}
  • {{ date | moment:"DD/MM/YYYY" }}
Explication : Le pipe date d'Angular formate un objet Date ou un timestamp. La syntaxe est date | date:"format". Les formats courants : "short", "medium", "long", "dd/MM/yyyy", "HH:mm".
Le pipe date d'Angular gère aussi l'internationalisation. Utilisez {{ date | date:"dd/MM/yyyy":"":"fr" }} pour forcer la locale française.

  • (bonne réponse)
Explication : La liaison de style (style binding) utilise la syntaxe [style.propriété]="expression". On peut aussi utiliser la directive [ngStyle] pour plusieurs styles : [ngStyle]="{"color": isRed ? "red" : "blue", "fontSize": size + "px"}".
Pour les styles avec tiret (ex: font-size), Angular supporte les deux notations : [style.font-size] ou [style.fontSize] (camelCase).

  • Créer un conteneur logique qui n'ajoute aucun élément HTML dans le DOM (bonne réponse)
  • Afficher du contenu conditionnel
  • Wrapper plusieurs composants dans un module
  • Créer une zone de dépose pour le drag-and-drop
Explication : <ng-container> est un élément de regroupement logique qui n'est pas rendu dans le DOM final. Il est utile pour appliquer plusieurs directives structurelles sans ajouter d'élément HTML inutile, ou pour grouper des éléments frères.
Cas d'usage courant : <ng-container *ngIf="condition"><li *ngFor="let item of items">...</li></ng-container> pour combiner *ngIf et *ngFor sans balise intermédiaire.

  • Utiliser FormGroup et FormControl depuis @angular/forms (bonne réponse)
  • Utiliser
  • Utiliser FormBuilder.make()
  • Utiliser @Form() dans le composant
Explication : Un formulaire réactif se crée en construisant un FormGroup contenant des FormControl. Exemple : form = new FormGroup({ name: new FormControl(""), email: new FormControl("") }). Ensuite, on lie le formulaire dans le template avec [formGroup]="form".
Utilisez FormBuilder (service injectble) pour simplifier la création : form = this.fb.group({ name: [""], email: [""] }).

  • {{ texte | upper }}
  • {{ texte | toUpperCase }}
  • {{ texte | uppercase }} (bonne réponse)
  • {{ texte | capitalize }}
Explication : Le pipe uppercase transforme une chaîne en majuscules. Angular fournit aussi lowercase pour les minuscules et titlecase pour mettre la première lettre de chaque mot en majuscule.
Chaîner les pipes : {{ texte | trim | lowercase }} — les pipes s'appliquent de gauche à droite. Note : trim n'existe pas en natif, c'est un exemple de pipe personnalisé.

  • { path: "users/:id", component: UserComponent } (bonne réponse)
  • { path: "users/{id}", component: UserComponent }
  • { path: "users/[id]", component: UserComponent }
  • { path: "users/$id", component: UserComponent }
Explication : Les paramètres de route se définissent avec :nomDuParamètre dans le chemin. Exemple : { path: "users/:id", component: UserComponent }. Accès dans le composant via ActivatedRoute.snapshot.paramMap.get("id").
On peut avoir plusieurs paramètres : { path: "users/:userId/posts/:postId" }. Pour des paramètres optionnels, utilisez les query params : /users?page=1.

  • Il convertit un objet JavaScript en JSON formaté, utile pour le débogage (bonne réponse)
  • Il envoie des données JSON à une API
  • Il parse une chaîne JSON en objet
  • Il valide le format JSON
Explication : Le pipe json convertit n'importe quelle valeur JavaScript en sa représentation JSON lisible avec JSON.stringify(). Il est principalement utilisé pour déboguer : <pre>{{ monObjet | json }}</pre>.
Très pratique pendant le développement pour visualiser la structure d'un objet directement dans le template, mais à retirer avant la mise en production.

  • (bonne réponse)
Explication : La directive routerLink permet de créer des liens de navigation Angular sans rechargement de page. On peut aussi passer un tableau pour construire le chemin : [routerLink]="["/users", userId]".
Ajoutez routerLinkActive="active" pour appliquer automatiquement une classe CSS quand la route correspondante est active.

  • @HostElement
  • @Host
  • @ElementRef
  • ElementRef injecté dans le constructeur (bonne réponse)
Explication : Pour accéder à l'élément DOM sur lequel une directive est appliquée, on injecte ElementRef dans le constructeur de la directive. this.el.nativeElement donne accès à l'élément DOM natif.
Préférez @HostBinding et @HostListener pour manipuler les propriétés et écouter les événements de l'élément hôte sans manipuler directement le DOM natif.

  • fetch("/api/data").then(r => r.json())
  • this.http.get("/api/data").subscribe(data => ...) (bonne réponse)
  • HttpRequest.get("/api/data")
  • angular.fetch("/api/data")
Explication : Le service HttpClient est injecté dans le composant et ses méthodes retournent des Observables. On appelle this.http.get<T>("/api/data") et on souscrit avec .subscribe(). Ne pas oublier provideHttpClient() dans app.config.ts.
Il est recommandé de placer les appels HTTP dans des services, pas directement dans les composants, pour une meilleure architecture et testabilité.

  • ngOnInit
  • ngAfterViewInit
  • ngOnDestroy (bonne réponse)
  • ngOnChanges
Explication : ngOnDestroy est appelé juste avant la destruction du composant. C'est le bon endroit pour se désinscrire des Observables, effacer les intervalles ou libérer toute ressource qui pourrait causer des fuites mémoire.
Implémentez l'interface OnDestroy pour signaler clairement l'intention : export class MonComposant implements OnInit, OnDestroy.

  • Utiliser des paramètres de route ou des query params (bonne réponse)
  • Utiliser window.location.search
  • Utiliser un cookie HTTP
  • Utiliser localStorage
Explication : On peut passer des données via les paramètres de route (/users/42), les query params (/users?page=2&sort=name), ou les fragments (/users#section). L'enfant les récupère via ActivatedRoute.
Pour naviguer avec des query params : this.router.navigate(["/users"], { queryParams: { page: 1 } }). Pour les préserver lors de la navigation, utilisez queryParamsHandling: "merge".

  • Effectue un OR logique
  • Applique un pipe pour transformer la valeur (bonne réponse)
  • Sépare plusieurs expressions
  • Définit une variable locale
Explication : Dans les templates Angular, | est l'opérateur pipe. Il passe la valeur à gauche comme argument à la fonction pipe à droite. Les pipes peuvent être chaînés : {{ valeur | pipe1 | pipe2 }}.
Les pipes peuvent accepter des arguments séparés par :. Exemple : {{ montant | currency:"EUR":"symbol":"1.2-2" }}.

  • {{ htmlString | rawHtml }}
  • (bonne réponse)
Explication : La liaison [innerHTML] permet d'injecter du HTML dans un élément. Angular sanitize automatiquement le contenu pour enlever les éléments dangereux (scripts, etc.). Pour insérer du HTML en toute confiance, utilisez DomSanitizer.bypassSecurityTrustHtml().
Soyez prudent avec [innerHTML] : n'injectez jamais du HTML venant directement de l'utilisateur sans sanitization pour éviter les attaques XSS.

  • @Input() reçoit des données du parent ; @Output() envoie des événements vers le parent (bonne réponse)
  • @Input() envoie des données au serveur ; @Output() affiche les résultats
  • @Input() et @Output() font la même chose
  • @Input() est pour les templates, @Output() pour les services
Explication : @Input() permet au parent de passer une valeur à l'enfant (flux descendant). @Output() combiné avec un EventEmitter permet à l'enfant de notifier le parent d'un événement (flux montant). Ensemble, ils permettent la communication parent-enfant bidirectionnelle.
Pensez à @Input()/@Output() comme des portes : Input est la porte d'entrée des données, Output est la porte de sortie des événements.

  • Case A Default (bonne réponse)
  • Case A
  • Case A
  • Case A
Explication : [ngSwitch] est une directive d'attribut placée sur le conteneur. Les cas sont définis avec *ngSwitchCase="valeur" et le défaut avec *ngSwitchDefault. Depuis Angular 17, vous pouvez utiliser la nouvelle syntaxe @switch et @case.
Nouvelle syntaxe Angular 17 : @switch (valeur) { @case ("A") { Case A } @default { Default } }.

  • Un mécanisme qui permet de passer du contenu HTML depuis le parent vers le composant enfant (bonne réponse)
  • Un service qui génère du contenu dynamique
  • Un pipe qui transforme le contenu
  • Une directive qui duplique le contenu
Explication : <ng-content> permet à un composant d'afficher le contenu que le parent lui passe entre ses balises. Exemple : dans un composant <app-card>, on place <ng-content></ng-content> dans son template, et le parent peut écrire <app-card><p>Mon texte</p></app-card>.
La projection sélective se fait avec <ng-content select=".header"></ng-content> pour projeter uniquement les éléments avec la classe "header".

  • ng g service mon-service (bonne réponse)
  • ng create service mon-service
  • ng make service mon-service
  • ng add service mon-service
Explication : ng generate service mon-service (abrégé ng g s mon-service) génère automatiquement un fichier mon-service.service.ts et son fichier de test mon-service.service.spec.ts.
Pour générer dans un sous-dossier : ng g s services/auth → créera src/app/services/auth.service.ts.

  • Stocker des variables de configuration selon l'environnement (dev/prod) (bonne réponse)
  • Configurer le serveur Node.js
  • Définir les variables CSS
  • Configurer la base de données
Explication : Les fichiers environment.ts (dev) et environment.prod.ts (prod) permettent de définir des constantes qui varient selon l'environnement : URLs d'API, clés, flags de debug. Angular CLI les remplace automatiquement au build selon la configuration.
Accès dans le code : import { environment } from "../environments/environment"; puis environment.apiUrl.

  • {{ valeur | pipe(argument) }}
  • {{ valeur | pipe:argument }} (bonne réponse)
  • {{ valeur | pipe[argument] }}
  • {{ valeur | pipe, argument }}
Explication : Les arguments d'un pipe se passent avec le caractère : après le nom du pipe. Pour plusieurs arguments : {{ valeur | pipe:arg1:arg2 }}. Exemple : {{ montant | currency:"EUR":"symbol" }}.
Le premier argument après : est le deuxième paramètre de la méthode transform(value, arg1, arg2) du pipe.

  • Écouter des événements sur l'élément hôte d'une directive ou d'un composant (bonne réponse)
  • Fournir le composant hôte à l'injection de dépendances
  • Déclarer l'hôte d'une application Angular
  • Lier une propriété de l'hôte
Explication : @HostListener("eventName") permet d'écouter des événements sur l'élément hôte directement depuis la classe du composant ou de la directive. Exemple : @HostListener("click", ["$event"]) onClick(event) { ... }.
On peut aussi écouter des événements du document ou de la fenêtre : @HostListener("window:resize", ["$event"]).

  • new FormControl("", [Validators.required]) (bonne réponse)
  • new FormControl({ required: true })
  • new FormControl("").require()
  • FormValidator.require(control)
Explication : Les validateurs s'ajoutent en deuxième argument du FormControl. Un seul validateur : new FormControl("", Validators.required). Plusieurs validateurs : new FormControl("", [Validators.required, Validators.minLength(3)]).
Pour afficher les erreurs : form.get("nom").errors?.["required"]. L'état de validité est accessible via form.get("nom").valid et .invalid.

  • ng generate guard auth (bonne réponse)
  • ng g route-guard auth
  • ng create guard auth
  • ng add guard auth
Explication : ng generate guard nom-du-guard (ou ng g guard nom-du-guard) génère un guard. L'Angular CLI demande quel type de guard créer (CanActivate, CanDeactivate, etc.).
Pour créer un guard CanActivate directement : ng g guard auth --implements CanActivate.

  • Un pipe pur n'est recalculé que si l'entrée change de référence ; un pipe impur est recalculé à chaque cycle de détection (bonne réponse)
  • Un pipe pur ne peut pas avoir d'effets de bord ; un pipe impur peut modifier le DOM
  • Un pipe pur est synchrone ; un pipe impur est asynchrone
  • Il n'y a pas de distinction entre pipe pur et impur
Explication : Par défaut, les pipes Angular sont "purs" : ils ne recalculent le résultat que quand la valeur d'entrée change de référence (nouveaux objets/arrays). Un pipe "impur" (pure: false) est réévalué à chaque cycle de détection de changement, ce qui est plus flexible mais moins performant.
Le pipe async est un exemple de pipe impur car il souscrit à des Observables qui peuvent émettre à n'importe quel moment.

  • { path: "", redirectTo: "/home", pathMatch: "full" } (bonne réponse)
  • { path: "", redirect: "/home" }
  • { path: "", navigateTo: "/home" }
  • { path: "", forward: "/home" }
Explication : La propriété redirectTo dans la configuration d'une route effectue une redirection. La clé pathMatch: "full" est obligatoire pour la route vide "" pour éviter qu'elle ne capture toutes les URLs.
Pour une page 404, ajoutez à la fin du tableau de routes : { path: "**", component: NotFoundComponent }. L'ordre des routes est important : la route wildcard doit toujours être en dernier.

  • {{ prix | currency:"EUR":"symbol":"1.2-2" }} pour formater un prix en euros avec 2 décimales (bonne réponse)
  • {{ prix | currency("EUR") }} avec parenthèses
  • {{ prix | money:"EUR" }} en utilisant le pipe money
  • {{ prix | format:"price":2 }} en utilisant format
Explication : Le pipe currency formate un nombre comme une devise. Arguments : code devise (ex: "EUR", "USD"), affichage ("symbol" montre €, "code" montre EUR), format numérique. Exemple : {{ 1234.5 | currency:"EUR":"symbol":"1.2-2" }} donne "€1 234,50" selon la locale.
Pour personnaliser la locale : ajoutez LOCALE_ID dans les providers de votre application. N'oubliez pas d'enregistrer la locale avec registerLocaleData(localeFr).