Skip to content

Commit 3046ec2

Browse files
committed
Use inject instead of constructor
1 parent a0d85fe commit 3046ec2

File tree

7 files changed

+65
-81
lines changed

7 files changed

+65
-81
lines changed

docs/src/components/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Angular provides lifecycle hook methods to tap into key events in the lifecycle
5959

6060
- `ngOnChanges`: called after the constructor and every time input values change. The method receives a SimpleChanges object of current and previous property values.
6161

62-
- `ngOnInit`: called only once. This is where the **component's initialisation** should take place, such as **fetching intial data**. Indeed components should be cheap to construct, so costly operations should be kept out of the constructor. The constructor should do no more than set the initial local variables to simple values.
62+
- `ngOnInit`: called only once. This is where the **component's initialisation** should take place, such as **fetching initial data**. Indeed components should be cheap to construct, so costly operations should be kept out of the constructor. The constructor should do no more than set the initial local variables to simple values.
6363

6464
- `ngDoCheck`: called immediately after `ngOnChanges` on every change detection run, and immediately after `ngOnInit` on the first run. Gives an opportunity to implement a custom change detection algorithm.
6565

docs/src/fr/pipes/README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,18 @@ Le premier argument de la méthode `transform` est la valeur sur laquelle le pip
8383

8484
Le nom du pipe doit être en lowerCamelCase. C'est une bonne pratique de le faire commencer par les initiales de votre application, tout comme pour le sélecteur de vos composants.
8585

86-
Comme toute autre classe, les pipes peuvent utiliser leur constructeur pour bénéficier de l'injection de dépendances. Il est possible d'injecter un autre pipe par exemple. Ceci est particulièrement utile lorsqu'un pipe intégré doit être utilisé dans toute l'application avec les mêmes paramètres. Un pipe personnalisé peut servir de wrapper afin de simplifier l'utilisation d'un pipe intégré.
86+
Comme toute autre classe, les pipes peuvent bénéficier de l'injection de dépendances. Il est possible d'injecter un autre pipe par exemple. Ceci est particulièrement utile lorsqu'un pipe intégré doit être utilisé dans toute l'application avec les mêmes paramètres. Un pipe personnalisé peut servir de wrapper afin de simplifier l'utilisation d'un pipe intégré.
8787

8888
Dans l'exemple suivant, le prix remisé est calculé en fonction d'un taux de remise. Aucune donnée du catalogue dans le composant n'est mutée pour afficher le nouveau prix.
8989

9090
<iframe height='500' width='100%' src="https://stackblitz.com/fork/github/ocunidee/atpw-custom-pipe/tree/master?ctl=1&embed=1&file=src/app/discounted.pipe.ts&hideNavigation=1&title=Custom%20pipe"></iframe>
9191

9292
## Utiliser un pipe en dehors d'un template
9393

94-
Il est également possible d'utiliser des pipes dans une classe de composant en l'injectant dans son constructeur et en appelant sa méthode transform. Le pipe doit alors être ajouté aux providers du composant ou de l'*ApplicationConfig*. Lorsqu'un pipe n'est pas utilisé dans le template, il n'a pas besoin d'être présent dans le tableau des imports du composant.
94+
Il est également possible d'utiliser des pipes dans une classe de composant en l'injectant et en appelant sa méthode transform. Le pipe doit alors être ajouté aux providers du composant ou de l'*ApplicationConfig*. Lorsqu'un pipe n'est pas utilisé dans le template, il n'a pas besoin d'être présent dans le tableau des imports du composant.
9595

9696
```ts
97-
import { Component } from '@angular/core'
97+
import { Component, inject } from '@angular/core'
9898
import { UpperCasePipe } from '@angular/common'
9999

100100
@Component({
@@ -104,8 +104,7 @@ import { UpperCasePipe } from '@angular/common'
104104
providers: [ UpperCasePipe ]
105105
})
106106
export class AppComponent {
107-
108-
constructor(private upperCasePipe: UpperCasePipe) {}
107+
private upperCasePipe = inject(UpperCasePipe)
109108

110109
title = this.upperCasePipe.transform('title')
111110
}

docs/src/fr/routing/README.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -360,20 +360,19 @@ Le service `ActivatedRoute` décrit l'état actuel du *router*. Grâce à lui, l
360360
`paramMap` et `queryParamMap` sont des Observables, une notion que nous verrons plus en détail dans un chapitre ultérieur. Un Observable permet d'observer comment les informations évoluent dans le temps. Le service `ActivatedRoute` fournit également une propriété `snapshot` pour obtenir uniquement l'état du routeur à un moment donné. Cette propriété est suffisante pour couvrir la plupart des cas.
361361

362362
Pour extraire un paramètre d'une route, deux étapes sont nécessaires :
363-
1. Injectez le service `ActivatedRoute` dans le constructeur du composant qui en a besoin
363+
1. Injectez le service `ActivatedRoute` dans le composant qui en a besoin
364364
2. Récupérez le paramMap depuis le snapshot dans le hook de cycle de vie `OnInit`
365365

366-
```ts{10,13}
367-
import { Component, OnInit } from '@angular/core'
366+
```ts{9,12}
367+
import { Component, OnInit, inject } from '@angular/core'
368368
import { ActivatedRoute } from '@angular/router'
369369
370370
@Component({
371371
selector: 'app-example',
372372
templateUrl: './exemple.component.html'
373373
})
374374
export class ExampleComponent implements OnInit {
375-
376-
constructor(private route: ActivatedRoute) {}
375+
private route = inject(ActivatedRoute)
377376
378377
ngOnInit(): void {
379378
const id: string = this.route.snapshot.paramMap.get('id')
@@ -387,9 +386,9 @@ Revenons à l'application *Personal Library*. Avec l'aide de `ActivatedRoute`, m
387386
```ts
388387
// book-details.component.ts
389388
export class BookDetailsComponent implements OnInit {
390-
details: BookDetail | null
389+
private route = inject(ActivatedRoute)
391390

392-
constructor(private route: ActivatedRoute) {}
391+
details: BookDetail | null
393392

394393
ngOnInit(): void {
395394
const id = this.route.snapshot.paramMap.get('id')
@@ -399,9 +398,9 @@ export class BookDetailsComponent implements OnInit {
399398

400399
// author-details.component.ts
401400
export class AuthorDetailsComponent implements OnInit {
402-
details: AuthorDetail | null
401+
private route = inject(ActivatedRoute)
403402

404-
constructor(private route: ActivatedRoute) {}
403+
details: AuthorDetail | null
405404

406405
ngOnInit(): void {
407406
const id = this.route.snapshot.paramMap.get('id')
@@ -421,7 +420,7 @@ Qu'est-ce que ça veut dire ? Si vous ne permettez la navigation vers la même r
421420
### Service Router
422421

423422
Parfois, il est nécessaire de déclencher certaines actions avant le routage. C'est ce qui se passe lorsque nous cliquons sur un bouton de connexion. Tout d'abord, un appel http est effectué et en fonction de la réponse, le routage a lieu. Le service `Router` permet de déclencher la navigation depuis la classe du composant.
424-
1. Injecter le service 'Router' via le constructeur
423+
1. Injecter le service 'Router' via la mtéthode *inject*
425424
2. Utilisez la méthode `navigateByUrl` pour déclencher la navigation. `navigateByUrl` prend toujours un chemin absolu. Si vous souhaitez utiliser un chemin relatif, utilisez plutôt la méthode `navigate`.
426425

427426
```ts{6,9}
@@ -430,7 +429,7 @@ Parfois, il est nécessaire de déclencher certaines actions avant le routage. C
430429
templateUrl: './example.component.html'
431430
})
432431
export class ExampleComponent {
433-
constructor(private router: Router) {}
432+
private router =inject(Router)
434433
435434
navigatePostLogin(): void {
436435
this.router.navigateByUrl('/dashboard')

docs/src/fr/services/README.md

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,18 @@ export class ExampleService {
2323
}
2424
```
2525

26-
Lorsqu'un composant nécessite un service, le service doit être ajouté à son constructeur de la manière suivante :
26+
Lorsqu'un composant nécessite un service, le service doit être injecté de la manière suivante :
2727

28-
```ts{11}
29-
import { Component } from '@angular/core'
28+
```ts{1, 9}
29+
import { Component, inject } from '@angular/core'
3030
import { ExampleService } from '@services/example.service'
3131
3232
@Component({
3333
selector: 'app-example',
3434
templateUrl: './example.component.html'
3535
})
3636
export class ExampleComponent {
37-
38-
constructor(
39-
private exampleService: ExampleService
40-
) {}
37+
private exampleService = inject(ExampleService)
4138
}
4239
```
4340

@@ -53,7 +50,7 @@ Au démarrage, Angular crée un injecteur à l'échelle de l'application. Si d'a
5350

5451
Vous ne l'avez peut-être pas réalisé, mais nous avons déjà fait appel à des fournisseurs. Dans le chapitre sur les pipes, pour utiliser le `UpperCasePipe` dans la classe du composant plutôt que dans le template, nous l'avons ajouté au tableau des providers du composant.
5552

56-
Lorsque Angular découvre qu'un composant dépend d'un service, il vérifie d'abord si l'injecteur a une instance existante de ce service. Si une instance du service demandé n'existe pas encore, l'injecteur en crée une à l'aide du provider enregistré et l'ajoute à l'injecteur avant de renvoyer le service à Angular. Lorsque tous les services demandés ont été résolus et renvoyés, Angular peut appeler le constructeur du composant avec ces services comme arguments.
53+
Lorsque Angular découvre qu'un composant dépend d'un service, il vérifie d'abord si l'injecteur a une instance existante de ce service. Si une instance du service demandé n'existe pas encore, l'injecteur en crée une à l'aide du provider enregistré et l'ajoute à l'injecteur avant de renvoyer le service à Angular. Lorsque tous les services demandés ont été résolus et renvoyés, Angular peut instancié le composant avec ces services.
5754

5855
Les dépendances peuvent être fournies à trois niveaux :
5956
- **au niveau root:** c'est le comportement par défaut lors de la création d'un service avec le CLI. C'est ce que signifie `providedIn: 'root'`. La *même instance* de la dépendance est injectée partout où elle est nécessaire comme s'il s'agissait d'un singleton.
@@ -117,15 +114,15 @@ inject(Router).createUrlTree(['/login'], { queryParams: { returnUrl: state.url }
117114

118115
Dans une Single Page Application (SPA), la communication avec le serveur se fait via des requêtes HTTP asynchrones (AJAX) ou des protocoles plus spécialisés tels que WebSocket. Nous allons voir comment faire ces requêtes réseau depuis une application Angular.
119116

120-
Angular fournit un module, le `HttpClientModule`, pour effectuer des appels HTTP. Le module fournit un service injectable, le `HttpClient`, pour faire des requêtes GET, POST, PATCH, DELETE et PUT. Pour injecter le `HttpClient` dans un service, ajoutez d'abord le `HttpClientModule` au tableau `imports` de `AppModule`.
117+
Angular fournit un module, le `HttpClientModule`, pour effectuer des appels HTTP. Le module fournit un service injectable, le `HttpClient`, pour faire des requêtes GET, POST, PATCH, DELETE et PUT. Pour injecter le `HttpClient` dans un service, ajoutez d'abord le `HttpClientModule` au tableau de `providers` de l'application dans le fichier `app.config.ts` en lui passant la fonction `provideHttpClient()`.
121118

122119
Voici quelques exemples:
123120

124121
<CodeGroup>
125122
<CodeGroupItem title="Service">
126123

127124
```ts
128-
import { Injectable } from '@angular/core'
125+
import { Injectable, inject } from '@angular/core'
129126
import { HttpClient } from '@angular/common/http'
130127
import { Observable } from 'rxjs'
131128
import { User } from '@models/user/user'
@@ -136,19 +133,19 @@ import { UserEdition } from '@models/user/user-edition'
136133
providedIn: 'root'
137134
})
138135
export class UserService {
139-
private baseUrl = 'api/backoffice/users'
136+
private httpClient = inject(HttpClient)
140137

141-
constructor(private httpClient: HttpClient) {}
138+
private baseUrl = 'api/backoffice/users'
142139

143-
public create(user: UserCreation): Observable<User> {
140+
create(user: UserCreation): Observable<User> {
144141
return this.httpClient.post<User>(this.baseUrl, user)
145142
}
146143

147-
public update(ref: string, user: UserEdition): Observable<User> {
144+
update(ref: string, user: UserEdition): Observable<User> {
148145
return this.httpClient.put<User>(`${this.baseUrl}/${ref}`, user)
149146
}
150147

151-
public getByUserReference(ref: string): Observable<User> {
148+
getByUserReference(ref: string): Observable<User> {
152149
return this.httpClient.get<User>(`${this.baseUrl}/${ref}`)
153150
}
154151
}
@@ -157,7 +154,7 @@ export class UserService {
157154
<CodeGroupItem title="Component">
158155

159156
```ts
160-
import { Component } from '@angular/core'
157+
import { Component, inject } from '@angular/core'
161158
import { User } from '@models/user/user'
162159
import { UserService } from '@services/user.service'
163160

@@ -166,11 +163,11 @@ import { UserService } from '@services/user.service'
166163
templateUrl: './user.component.html'
167164
})
168165
export class UserComponent {
166+
private userService = inject(UserService)
167+
169168
user: User | undefined = undefined
170169
reference = ''
171170

172-
constructor(private userService: UserService) {}
173-
174171
getUser(): void {
175172
this.userService.getByUserReference(this.reference))
176173
.subscribe(user => this.user = user)
@@ -306,10 +303,9 @@ Prenez note du token dans la `UserResponse`, il servira à authentifier l'utilis
306303
<CodeGroupItem title="authentication.service.ts">
307304

308305
```ts
306+
private httpClient = inject(HttpClient)
309307
private baseUrl = 'api/user'
310308

311-
constructor(private httpClient: HttpClient) {}
312-
313309
login(loginRequest: LoginRequest): Observable<UserResponse> {
314310
return this.httpClient.post<UserResponse>(`${this.baseUrl}/login`, loginRequest)
315311
}
@@ -334,11 +330,9 @@ register(loginRequest: LoginRequest): Observable<UserResponse> {
334330
<CodeGroupItem title="login-form.component.ts">
335331

336332
```ts
337-
constructor(
338-
private router: Router,
339-
private activatedRoute: ActivatedRoute,
340-
private authenticationService: AuthenticationService
341-
) {}
333+
private router = inject(Router)
334+
private activatedRoute = inject(ActivatedRoute)
335+
private authenticationService = inject(AuthenticationService)
342336

343337
login(): void {
344338
this.authenticationService.login(this.loginRequest)

docs/src/pipes/README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ In the following example, the discounted price is calculated given a discount ra
9191

9292
## Using a pipe outside the template
9393

94-
It is also possible to use pipes in a component class by injecting it in its constructor and calling its transform method. The pipe needs to be added to the providers array of the component decorator or *ApplicationConfig*. When not used in the template, the pipe doesn't need to be present in the imports array of the component decorator.
94+
It is also possible to use pipes in a component class by injecting via the *inject* method and calling its transform method. The pipe needs to be added to the providers array of the component decorator or *ApplicationConfig*. When not used in the template, the pipe doesn't need to be present in the imports array of the component decorator.
9595

9696
```ts
97-
import { Component } from '@angular/core'
97+
import { Component, inject } from '@angular/core'
9898
import { UpperCasePipe } from '@angular/common'
9999

100100
@Component({
@@ -104,8 +104,7 @@ import { UpperCasePipe } from '@angular/common'
104104
providers: [ UpperCasePipe ]
105105
})
106106
export class AppComponent {
107-
108-
constructor(private upperCasePipe: UpperCasePipe) {}
107+
private upperCasePipe = inject(UpperCasePipe)
109108

110109
title = this.upperCasePipe.transform('title')
111110
}

docs/src/routing/README.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -360,20 +360,19 @@ The `ActivatedRoute` service describes the current state of the *router*. Throug
360360
`paramMap` and `queryParamMap` are Observables, a notion we will see more in detail in a later chapter. Observable allows to observe how information change over time. The `ActivatedRoute` service also provides a `snapshot` property to only get the state of the router at a given point in time. This property is enough to cover most cases.
361361

362362
To extract a parameter from a route, two steps are required:
363-
1. Inject the `ActivatedRoute` service in the constructor of the component needing it
363+
1. Inject the `ActivatedRoute` service in the component needing it
364364
2. Retrieve the paramMap from the snapshot in the `OnInit` lifecycle hook
365365

366-
```ts{10,13}
367-
import { Component, OnInit } from '@angular/core'
366+
```ts{9,12}
367+
import { Component, OnInit, inject } from '@angular/core'
368368
import { ActivatedRoute } from '@angular/router'
369369
370370
@Component({
371371
selector: 'app-example',
372372
templateUrl: './exemple.component.html'
373373
})
374374
export class ExampleComponent implements OnInit {
375-
376-
constructor(private route: ActivatedRoute) {}
375+
private route = inject(ActivatedRoute)
377376
378377
ngOnInit(): void {
379378
const id: string = this.route.snapshot.paramMap.get('id')
@@ -387,9 +386,9 @@ Let's go back to the *Personal Library* app. With the help of the `ActivatedRout
387386
```ts
388387
// book-details.component.ts
389388
export class BookDetailsComponent implements OnInit {
390-
details: BookDetail | null
389+
private route = inject(ActivatedRoute)
391390

392-
constructor(private route: ActivatedRoute) {}
391+
details: BookDetail | null
393392

394393
ngOnInit(): void {
395394
const id = this.route.snapshot.paramMap.get('id')
@@ -399,9 +398,9 @@ export class BookDetailsComponent implements OnInit {
399398

400399
// author-details.component.ts
401400
export class AuthorDetailsComponent implements OnInit {
402-
details: AuthorDetail | null
401+
private route = inject(ActivatedRoute)
403402

404-
constructor(private route: ActivatedRoute) {}
403+
details: AuthorDetail | null
405404

406405
ngOnInit(): void {
407406
const id = this.route.snapshot.paramMap.get('id')
@@ -421,7 +420,7 @@ What does it mean ? If you only allow the navigation to the same route via the a
421420
### Router service
422421

423422
Sometimes, it is necessary to trigger some actions before routing. This is what happens when we click on a login button. First, an http call is made and depending on the response, routing takes place. The `Router` service allows to trigger navigation from the component class.
424-
1. Inject the `Router` service via the constructor
423+
1. Inject the `Router` service via the inject method
425424

426425
2. Use the `navigateByUrl` method to trigger the navigation. `navigateByUrl` always takes an absolute path. In case you would like to user a relative path, use the `navigate` method instead.
427426

@@ -431,7 +430,7 @@ Sometimes, it is necessary to trigger some actions before routing. This is what
431430
templateUrl: './example.component.html'
432431
})
433432
export class ExampleComponent {
434-
constructor(private router: Router) {}
433+
private router = inject(Router)
435434
436435
navigatePostLogin(): void {
437436
this.router.navigateByUrl('/dashboard')

0 commit comments

Comments
 (0)