Angular est un framework de développement web open source maintenu par Google qui encadre le développement d'expériences utilisateur riches sur différentes plateformes: web, PWA, mobile natif et application de bureau.

+----------------------------------------------+
|App { <----------------+ |
| | |
| name: string | |
| | |
| (click) => alert | |
| | (confirmed) |
| Scoped CSS | |
| | |
|} | |
| | |
| | |
| +--------+-------------------+ |
| |Input { | |
| | | |
| | name: string | |
| | | |
| | (click) => emit confirmed | |
| | | |
| | [(name)] => p | |
| | | |
| |} | |
| | | |
| +----------------------------+ |
| |
+----------------------------------------------+Votre objectif est de réaliser le tutoriel d'introduction officiel d'Angular. Pour vous favoriser le développement de votre compréhension, des questions/réflexions vous accompagneront au fil de la démarche.
ATTENTION
Suite à la réalisation des étapes du tutoriel(sauf la dernière portant sur HTTP), vous devrez ajouter des fonctionnalités supplémentaires décrites dans le laboratoire 1. Il serait pertinent de survoler le travail attendu avant de compléter le tutoriel.
On utilise le langage TypeScript, combiné aux outils de l'écosystème JavaScript modernes:
# Pour permettre le live-reload sans depasser le nombres de fichiers a surveiller
su - -c "echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p"Extra
Machine virtuelle H2026, au besoin
node -v
npm -v
ng version # version actuelle?
# et plus?ATTENTION
Pour cette étape, utiliser un nouveau projet généré localement sur votre machine.
src/styles.csssrc/assets/* 👉 publicsrc/app/app.tssrc/app/app.css{
...
"projects": {
"labo1": {
...
"architect": {
"build": {
"builder": "@angular/build:application",
"options": {
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
...
},
}
}
}
}
}ng g c home -t -s --skip-tests --type page
# On peut donner explicitement le chemin de destination à partir de src/app/
ng g c path/to/folder/NAME -t -s --skip-tests --type page
# src/app/path/to/folder/NAME/name.ts
# Flat, pour enlever le sous-dossier
ng g c path/to/folder/NAME --flat -t -s --skip-tests --type page
# src/app/path/to/folder/name.ts
# utiliser le kebab-case, ex: location-detail deviendra la classe LocationDetailOn peut voir l'interface comme la forme primitive d'un model pour encadre la structurer des données
ng g i models/location --type modelCommencer à réfléchir à l'organisation judicieuses des fichiers à l'intérieur de votre projet.
"baseUrl": "./src/app" dans compilerOptions
src
├── app
│ ├── app.component.ts
│ ├── app.config.ts
│ ├── app.routes.ts
│ ├── housing
│ │ ├── housing.page.ts
│ │ └── location.component.ts
│ ├── models
│ │ └── location.interface.ts
│ └── services
│ └── housing.service.ts
├── index.html
├── main.ts
└── styles.csssrc
├── app
│ ├── app.component.ts
│ ├── app.config.ts
│ ├── app.routes.ts
│ ├── housing
│ │ ├── housing.page.ts
│ │ └── housing.service.ts
│ └── location
│ ├── location.interface.ts
│ └── location.component.ts
├── index.html
├── main.ts
└── styles.cssPour simuler une liste de plusieurs locations, dupliquer le component
template: `
<div>
<app-location></app-location>
<app-location></app-location>
<app-location></app-location>
</div>
`,Les signals sont la mécanique moderne de réactivité dans Angular. Ils fournissent des outils simples pour suivre le changements des variables dynamiques:
count = signal(0); // Initialisation
console.log('The count is: ' + count()); // Lecture
count.set(3); // Mise à jour
count.update((value) => value + 1); // En considérant la valeur précédente
// La réactivité déclenche le rendu du template
const doubled = computed(() => count() * 2); // Mis à jour automatiquement lorsque count change, réactivité!
effect(() => {
console.log(`Count changed ${count()}`);
});Attention La structure du nouveau projet créé précédemment est différente du tutoriel, assurez-vous de transposer correctement les modifications.
src/app/app.config.tsTestez la navigation via la barre d'adresse vers /details/xyz.
Les changements aux configurations TypeScript, Angular, Application demandent de redémarrer le serveur de développement.
<a routerLink="/details/{{ location().id }}">Details</a>
<!-- VS -->
<a [routerLink]="['/details', location().id]">Details</a>
<!-- ??? -->
<a href="/details/{{ location().id }}">Details</a>Les variables membres des components sont également réactives. Les signals représentent l'évolution des mécanismes de change detection d'Angular et offre une approche plus efficace. Donc lorsque que l'état est susceptible de changer au fil du temps, pour déclencher une mise à jour du component, les signals sont à privilégier.
Ajouter un alert de la représentation JSON des données du formulaire.
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
address: new FormGroup({
street: new FormControl(''),
city: new FormControl(''),
state: new FormControl(''),
zip: new FormControl(''),
}),
});profileForm = this.formBuilder.group({
firstName: [''],
lastName: [''],
address: this.formBuilder.group({
street: [''],
city: [''],
state: [''],
zip: [''],
}),
}); Utiliser l'événement submit du formulaire plutôt que le click du bouton
FormsModule pour activer les mécaniques de formulaire Angular OU de mettre en place un FormGroup du ReactiveFormsModule
type="submit" du boutonLes Template-driven Forms, via la directive ngForm et les Reactive Forms via la directive [formGroup], supportent l'événement (submit) en plus de (ngSubmit).