You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/src/components/README.md
+118-7Lines changed: 118 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ We've previously seen that:
4
4
- a component is a class decorated with the `@Component` decorator
5
5
- it is generated via the CLI by the `ng g c component-name` command
6
6
- by default, a component is generated with an associated html file and stylesheet file
7
-
- the `@Component` decorator has [options](https://angular.io/api/core/Component#description) like `templateUrl`, `styleUrl` or `selector`.
7
+
- the `@Component` decorator has [options](https://angular.dev/api/core/Component#description) like `templateUrl`, `styleUrl` or `selector`.
8
8
9
9
## View encapsulation and styling
10
10
@@ -24,10 +24,10 @@ Under the default option, styles specified in the component's style file are not
24
24
### `:host` selector
25
25
Situations may arise where styling the host element of the component from the component's stylesheet is needed. To do so, Angular provides a pseudo-class selector: `:host`.
26
26
27
-
Let's imagine we require a border on the AppComponent. This is how to add it:
27
+
Let's imagine we require a border on the LoginFormComponent. This is how to add it without having to add a `<div>` around the `<form>` and the `<ul>`:
28
28
29
29
<CodeGroup>
30
-
<CodeGroupItemtitle="app.component.scss">
30
+
<CodeGroupItemtitle="login-form.component.scss">
31
31
32
32
```css
33
33
:host {
@@ -40,7 +40,7 @@ Let's imagine we require a border on the AppComponent. This is how to add it:
40
40
The next example targets the host element again, but only when it also has the active CSS class.
41
41
42
42
<CodeGroup>
43
-
<CodeGroupItemtitle="app.component.scss">
43
+
<CodeGroupItemtitle="login-form.component.scss">
44
44
45
45
```css
46
46
:host(.active) {
@@ -91,7 +91,7 @@ Here is how the `AppComponent` would communicate to its child component `BlogPos
91
91
// app.component.ts
92
92
import { Component } from"@angular/core"
93
93
@Component({
94
-
selector: "my-app",
94
+
selector: "app-root",
95
95
templateUrl: "./app.component.html"
96
96
})
97
97
exportclassAppComponent {
@@ -131,6 +131,57 @@ export class BlogPostComponent {
131
131
132
132
To watch for changes on an `@Input()` property, you can use the `ngOnChanges` lifecycle hook.
133
133
134
+
::: details input() function to work with Signals (Angular 17+)
135
+
The *zone.js* library serves as a critical foundation for change detection in Angular, enabling the framework to automatically track asynchronous operations like HTTP calls, timers or user interactions. By creating execution contexts, *zone.js* allows Angular to know when to update the user interface without manual intervention from developers. As you become proficient in Angular, understanding how Zone.js manages change detection is of great help to optimise the code and tackle complex use cases. Since Angular 17 and particularly the introduction of reactive programming features in Angular, the reliance on *zone.js* is being reconsidered as it is considered an overhead that is not always optimised. As of Angular 19, it is possible to experimentally opt-out of using *zone.js* to manage change detection. Developers are encouraged to explore new reactive paradigms, such as signals and the refined change detection strategies as alternatives to enhance performance and streamline state management. As you advance your Angular skills, staying abreast of these changes will empower you to build more optimised and maintainable applications.
136
+
137
+
As of Angular 17, it is possible to shift from using the traditional `@Input()` decorator to the more functional `input()` method to communicate data from a parent to a child component. This change is part of Angular's effort to improve performance and simplify change detection while moving away from the overhead of *zone.js*. While `@Input()` automatically triggers change detection through *zone.js*, the `input()` function allows developers to create reactive inputs that are closely integrated with Angular’s new signal-based architecture.
In this example, the ParentComponent uses a signal to pass a reactive value to the ChildComponent, which defines `childValue` using the `input()` function.
162
+
163
+
When creating reactive inputs using the `input()` function in Angular, you have the flexibility to define whether an input can have a default value or if it is required. When you specify a default value for an input using the `input()` function, it means that the component can operate with that initial value if no external data is passed in from a parent component. This can be particularly useful for creating components that have sensible defaults. If the parent does not provide a value, the component will still render without issues. On the other hand, required inputs indicate that the parent component **must** provide a value for that input.
164
+
165
+
```ts
166
+
import {Component, input} from'@angular/core'
167
+
168
+
@Component({/*...*/})
169
+
exportclassCustomSlider {
170
+
// Declare a required input named 'value'.
171
+
value =input.required<number>()
172
+
// Create a computed expression that reads the value input
173
+
label =computed(() =>`The slider's value is ${this.value()}`)
174
+
}
175
+
```
176
+
And here is how you must pass data to the required `value` input:
177
+
178
+
```html
179
+
<custom-slider[value]="50"></custom-slider>
180
+
```
181
+
182
+
As you can see, as long as the application is using *zone.js*, the parent doesn't have to pass a Signal, it can pass regular values or primitives.
183
+
:::
184
+
134
185
**Exercise: Pass down each book's info to the BookComponent**
@@ -420,6 +531,6 @@ Do not replace the comment with the list of `FilmComponent` yet. This will be do
420
531
:::
421
532
422
533
## To go further
423
-
Learn about context aware content projection using [ngTemplateOutlet](https://indepth.dev/posts/1405/ngtemplateoutlet)
534
+
Learn about context aware content projection using [ngTemplateOutlet](https://angular.love/ngtemplateoutlet-the-secret-to-customisation)
424
535
425
536
Angular 14 has introduced *standalone components* and there were taken out of beta in Angular 15. You can learn more about them [here](https://blog.ninja-squad.com/2022/05/12/a-guide-to-standalone-components-in-angular/)
Copy file name to clipboardExpand all lines: docs/src/fr/components/README.md
+118-7Lines changed: 118 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ Nous avons vu précédemment que :
4
4
- un composant est une classe décorée avec le décorateur `@Component`
5
5
- il est généré via CLI par la commande `ng g c component-name`
6
6
- par défaut, un composant est généré avec un fichier html et une feuille de style associés
7
-
- le décorateur `@Component` a des [options](https://angular.io/api/core/Component#description) comme `templateUrl`, `styleUrl` ou `selector`.
7
+
- le décorateur `@Component` a des [options](https://angular.dev/api/core/Component#description) comme `templateUrl`, `styleUrl` ou `selector`.
8
8
9
9
## Encapsulation de vue et style
10
10
@@ -23,10 +23,10 @@ Sous l'option par défaut, les styles spécifiés dans le fichier de style du co
23
23
### Sélecteur CSS `:host`
24
24
Des situations peuvent survenir où styler l'élément hôte du composant à partir de sa propre feuille de style est nécessaire. Pour ce faire, Angular fournit un sélecteur de pseudo-classe : `:host`.
25
25
26
-
Imaginons que nous ayons besoin d'une bordure sur AppComponent. Voici comment l'ajouter :
26
+
Imaginons que nous ayons besoin d'une bordure sur le LoginFormComponent. Voici comment l'ajouter sans rajouter de `<div>` pour englober le `<form>` et le `<ul>` :
27
27
28
28
<CodeGroup>
29
-
<CodeGroupItemtitle="app.component.scss">
29
+
<CodeGroupItemtitle="login-form.component.scss">
30
30
31
31
```css
32
32
:host {
@@ -39,7 +39,7 @@ Imaginons que nous ayons besoin d'une bordure sur AppComponent. Voici comment l'
39
39
L'exemple suivant cible à nouveau l'élément hôte, mais uniquement lorsqu'il possède également la classe CSS active.
40
40
41
41
<CodeGroup>
42
-
<CodeGroupItemtitle="app.component.scss">
42
+
<CodeGroupItemtitle="login-form.component.scss">
43
43
44
44
```css
45
45
:host(.active) {
@@ -90,7 +90,7 @@ Voici comment l'`AppComponent` communiquerait à son composant enfant `BlogPostC
90
90
// app.component.ts
91
91
import { Component } from"@angular/core"
92
92
@Component({
93
-
selector: "my-app",
93
+
selector: "app-root",
94
94
templateUrl: "./app.component.html"
95
95
})
96
96
exportclassAppComponent {
@@ -130,6 +130,57 @@ export class BlogPostComponent {
130
130
131
131
Pour surveiller les changements sur une propriété `@Input()`, vous pouvez utiliser le hook de cycle de vie `ngOnChanges`.
132
132
133
+
134
+
::: details Fonction `input()` pour travailler avec les signaux (Angular 17+)
135
+
La librairie *zone.js* constitue une base essentielle pour la détection des changements dans Angular, permettant au framework de suivre automatiquement les opérations asynchrones telles que les appels HTTP, les timers ou les interactions utilisateur. En créant des contextes d'exécution, *zone.js* permet à Angular de savoir quand mettre à jour l'interface utilisateur sans intervention manuelle de la part des développeurs. Lors de votre montée en compétence en Angular, comprendre comment *Zone.js* gère la détection des changements est très utile pour optimiser le code et traiter des cas complexes. Depuis Angular 17 et particulièrement avec l'introduction des fonctionnalités de programmation réactive dans Angular, la dépendance à *zone.js* est en train d'être réévaluée, car elle est considérée comme une surcharge qui n'est pas toujours optimisée. Depuis Angular 19, il est possible de choisir expérimentalement de ne pas utiliser *zone.js* pour gérer la détection des changements. Les développeurs sont encouragés à explorer de nouveaux paradigmes réactifs, tels que les signaux comme alternative pour améliorer les performances et rationaliser la gestion de l'état. En développant vos compétences en Angular, rester informé de ces changements vous permettra de créer des applications plus optimisées et maintenables.
136
+
137
+
Depuis Angular 17, il est possible de passer de l'utilisation du décorateur traditionnel `@Input()` à la méthode plus fonctionnelle `input()` pour communiquer entre un composant parent et un composant enfant. Ce changement fait partie des efforts d'Angular pour améliorer les performances et simplifier la détection des changements tout en se distanciant de la surcharge de *zone.js*. Alors que `@Input()` déclenche automatiquement la détection des changements via *zone.js*, la fonction `input()` permet aux développeurs de créer des inputs réactifs qui sont intégrées à la nouvelle architecture basée sur les signaux d'Angular.
Dans cet exemple, le `ParentComponent` utilise un signal pour passer une valeur réactive au `ChildComponent`, qui définit `childValue` à l'aide de la fonction `input()`. Cette approche réduit la dépendance à *zone.js* tout en améliorant les performances et la réactivité.
162
+
163
+
Lors de la création d'inputs réactifs à l'aide de la fonction `input()` dans Angular, vous avez la flexibilité de définir si un input a une valeur par défaut ou si elle est requise. Lorsque vous spécifiez une valeur par défaut pour un input en utilisant la fonction `input()`, cela signifie que le composant peut fonctionner avec cette valeur initiale si aucune donnée externe n'est passée à partir d'un composant parent. Cela peut être particulièrement utile pour créer des composants ayant des valeurs par défaut raisonnables. Si le parent ne fournit pas de valeur, le composant s'affichera toujours sans problème. D'autre part, les inputs requis indiquent que le composant parent **doit** fournir une valeur pour cet input.
164
+
165
+
```ts
166
+
import { Component, input } from'@angular/core'
167
+
168
+
@Component({/*...*/})
169
+
exportclassCustomSlider {
170
+
// Déclarer une entrée requise nommée 'value'.
171
+
value =input.required<number>()
172
+
// Créer une expression calculée qui lit la valeur d'entrée
173
+
label =computed(() =>`La valeur du curseur est ${this.value()}`)
174
+
}
175
+
```
176
+
Et voici comment vous devez passer des données à l'input `value` requis :
177
+
178
+
```html
179
+
<custom-slider[value]="50"></custom-slider>
180
+
```
181
+
Comme on peut le voir ici, le composant parent n'a pas besoin de passer un Signal à `value` tant que l'application utilise *zone.js*.
182
+
:::
183
+
133
184
**Exercice : Transmettez les informations de chaque livre au BookComponent**
@@ -194,6 +247,64 @@ export class AddTaskComponent {
194
247
195
248
Vous pouvez expérimenter avec cet exemple [ici](https://stackblitz.com/edit/angular-output-training-example?file=src/app/app.component.ts).
196
249
250
+
::: details Fonction output() (Angular 17+)
251
+
De la même manière que `input()` remplace `@Input()`, `output()` remplace `@Output()`. Voici l'exemple d'au-dessus en faisant usage de la fonction `output()`.
252
+
253
+
<CodeGroup>
254
+
<CodeGroupItemtitle="Parent component">
255
+
256
+
```ts
257
+
// app.component.ts
258
+
import { Component } from"@angular/core"
259
+
@Component({
260
+
selector: "my-app",
261
+
templateUrl: "./app.component.html"
262
+
})
263
+
exportclassAppComponent {
264
+
items = ['Do the laundry', 'Wash the dishes', 'Read 20 pages']
@@ -419,6 +530,6 @@ Ne remplacez pas déjà le commentaire par la liste des `FilmComponent`. C'est l
419
530
:::
420
531
421
532
## Pour aller plus loin
422
-
En savoir plus sur la projection de contenu contextuelle en utilisant [ngTemplateOutlet](https://indepth.dev/posts/1405/ngtemplateoutlet)
533
+
En savoir plus sur la projection de contenu contextuelle en utilisant [ngTemplateOutlet](https://angular.love/ngtemplateoutlet-the-secret-to-customisation)
423
534
424
535
Angular 14 a introduit les *standalone components* en version beta dans le framework et Angular 15 a rendu leur API stable. Vous pouvez en apprendre plus sur ce type de composants [ici](https://blog.ninja-squad.com/2022/05/12/a-guide-to-standalone-components-in-angular/)
0 commit comments