-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dev #1
base: main
Are you sure you want to change the base?
Dev #1
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,41 @@ | ||
import { Component } from '@angular/core'; | ||
import { Component, OnInit } from '@angular/core'; | ||
import { AsyncPipe } from '@angular/common'; | ||
import { Observable, map, range, take } from 'rxjs'; | ||
|
||
@Component({ | ||
selector: 'app-ex1', | ||
standalone: true, | ||
imports: [AsyncPipe], | ||
template: ``, | ||
template: ` | ||
<h2> Exercice 1 </h2> | ||
<div style="display: flex;"> | ||
@for (number of numbers; track number) { | ||
<p>{{ number}},</p> | ||
} | ||
</div> | ||
`, | ||
}) | ||
export class Ex1Component { | ||
// TODO : Créer un observable qui émet une séquence de nombre de 1 à 10 | ||
// TODO : Affiche le résultat dans la console et dans le template | ||
// TODO : Multiplier chaque valeur de l'observable par 2 | ||
// TODO : Emettre uniquement les valeurs pairs | ||
export class Ex1Component implements OnInit { | ||
|
||
// TODO : Créer un observable qui émet une séquence de nombre de 1 à 10 | ||
private _numbers$ = range(1, 10) | ||
numbers: Array<number> = [] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On peut se passer de cette variable intermédiaire |
||
|
||
|
||
constructor() {} | ||
|
||
ngOnInit(): void { | ||
console.log('---------------- exercice 1 ----------------') | ||
this._numbers$ | ||
// TODO : Emettre uniquement les valeurs pairs | ||
// TODO : Multiplier chaque valeur de l'observable par 2 | ||
.pipe(take(10), map(nb => 2*nb)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. À quoi sert le take(10) dans ce cas de figure ? |
||
.subscribe({ | ||
next: (nb: number) => { | ||
// TODO : Affiche le résultat dans la console et dans le template | ||
console.log(nb) | ||
this.numbers.push(nb) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On peut se passer de cette variable |
||
} | ||
}) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,45 @@ | ||
import { Component } from '@angular/core'; | ||
import { Observable, of, throwError } from 'rxjs'; | ||
import { Component, OnInit } from '@angular/core'; | ||
import { Observable, combineLatest, concat, filter, map, merge, of, range, throwError } from 'rxjs'; | ||
|
||
@Component({ | ||
selector: 'app-ex2', | ||
standalone: true, | ||
template: `` | ||
template: ` | ||
<h2> Exercice 2 </h2> | ||
|
||
@for (message of errorMessage; track message) { | ||
<p class="error">{{ message}} </p> | ||
} | ||
` | ||
}) | ||
export class Ex2Component { | ||
export class Ex2Component implements OnInit { | ||
// TODO : Créer deux observables | ||
// TODO : Le premier observable émet des valeurs paires de 1 à 10 | ||
private _evenNumbers$ = range(1, 10).pipe(filter(nb => nb % 2 === 0)) | ||
// TODO : Le second observable émet des valeurs impaires de 1 à 10 | ||
private _oddNumbers$ = range(1, 10).pipe(filter(nb => nb % 2 != 0)) | ||
|
||
// TODO : Merger les deux observables pour n'en former qu'un seul | ||
private _numbers$ = merge(this._evenNumbers$, this._oddNumbers$) | ||
|
||
// TODO : Utiliser un opérateur pour afficher les retours de la méthode getFromId() | ||
// TODO : Notifier l'utilisateur en cas d'erreur | ||
errorMessage: string[] = []; | ||
|
||
constructor() {} | ||
|
||
ngOnInit(): void { | ||
console.log('---------------- exercice 2 ----------------') | ||
this._numbers$ | ||
.subscribe({ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. L'idée est de maximiser l'usage des operator xrjs. Je t'invite donc à réécrire ton code dans ce sens. |
||
next: id => { | ||
getFromId(id).subscribe({ // !REVIEW use switch map instead | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oui c'est ça switchMap est l'opérateur qu'il te faut |
||
next: result => console.log(result), | ||
error: error => this.errorMessage.push(`Une erreur est survenue à l'id ${error}.`) | ||
}) | ||
} | ||
}) | ||
} | ||
} | ||
|
||
// - Contraintes : Il est interdit de modifier cette méthode | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,36 @@ | ||
import { Component } from '@angular/core'; | ||
import { Component, OnInit } from '@angular/core'; | ||
import { combineLatest, debounce, interval, map, range, sampleTime, scan, take } from 'rxjs'; | ||
|
||
@Component({ | ||
selector: 'app-ex3', | ||
standalone: true, | ||
imports: [], | ||
template: `` | ||
template: ` | ||
<h2> Exercice 3 </h2> | ||
<div style="display: flex;"> | ||
@for (tuple of tuples; track tuple[0]) { | ||
<p>{{ tuple }} </p> | ||
} | ||
</div> | ||
` | ||
}) | ||
export class Ex3Component { | ||
export class Ex3Component implements OnInit { | ||
// TODO : Créer deux observables qui emettent des valeurs à interval régulier mais un interval différent | ||
private _lettreA$ = interval(1000).pipe(map(_ => 'A')) | ||
private _lettreZ = interval(1500).pipe(map(_ => 'Z')) | ||
// TODO : Combiner les deux observables pour former un qui émet des tuples des valeurs émises par chacun des deux observables | ||
// TODO : Afficher uniquement les 10 premières valeurs émises par le nouvel observable | ||
|
||
|
||
private _combined$ = combineLatest([this._lettreA$, this._lettreZ]).pipe(map(([nb1, nb2]) => [nb1, nb2])) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. À quoi sert le map à la fin de la ligne ? |
||
tuples: Array<string []> = [] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Encore une variable intermédiaire inutile |
||
constructor() {} | ||
|
||
ngOnInit(): void { | ||
console.log('---------------- exercice 3 ----------------') | ||
// TODO : Afficher uniquement les 10 premières valeurs émises par le nouvel observable | ||
this._combined$.pipe(take(10)).subscribe((tuple: Array<string>) => { | ||
console.log(tuple) | ||
this.tuples.push(tuple) | ||
}) | ||
|
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,44 @@ | ||
import { Component } from '@angular/core'; | ||
import { Component, OnInit } from '@angular/core'; | ||
import { filter, interval, map, take } from 'rxjs'; | ||
|
||
@Component({ | ||
selector: 'app-ex4', | ||
standalone: true, | ||
imports: [], | ||
template: '' | ||
template: ` | ||
<h2> Exercice 4 </h2> | ||
<div style="display: flex;"> | ||
@for (r of result; track r) { | ||
<p>{{ r }} </p> | ||
} | ||
</div> | ||
` | ||
}) | ||
export class Ex4Component { | ||
export class Ex4Component implements OnInit { | ||
// TODO : Utiliser un interval pour émettre des valeurs | ||
// TODO : Utiliser un opérateur pour limiter le nombre de valeurs émises à 10 | ||
// TODO : Utiliser un opérateur pour limiter les valeurs émises en fonction d'une condition | ||
_count: number = 0 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cette variable compte, mais interval(x) compte également. la variable est donc inutile. |
||
private _values$ = interval(1000).pipe(map(_ => { | ||
this._count += 1 | ||
return this._count | ||
})) | ||
|
||
// TODO : Utiliser un opérateur pour émettre les 5 dernières valeurs | ||
|
||
|
||
result: Array<number> = [] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Variable inutile |
||
|
||
constructor() {} | ||
ngOnInit(): void { | ||
console.log('---------------- exercice 3 ----------------') | ||
this._values$ | ||
.pipe( | ||
// TODO : Utiliser un opérateur pour limiter le nombre de valeurs émises à 10 | ||
take(10), | ||
// TODO : Utiliser un opérateur pour limiter les valeurs émises en fonction d'une condition | ||
filter(value => value % 2 === 0)) | ||
.subscribe(value => { | ||
console.log(value) | ||
this.result.push(value) | ||
}) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
<app-notification-control></app-notification-control> | ||
<app-notification-list></app-notification-list> | ||
<div class="conversation"> | ||
<app-notification-control></app-notification-control> | ||
<app-notification-list></app-notification-list> | ||
</div> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,38 @@ | ||
/* You can add global styles to this file, and also import other style files */ | ||
body { | ||
background-color: #EAECEE; | ||
color: #17202A ; | ||
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; | ||
font-size: 20px; | ||
display: flex; | ||
justify-content: center; | ||
align-items: center; | ||
} | ||
|
||
.conversation { | ||
padding: 16px; | ||
background-color: #ABB2B9 ; | ||
border-radius: 8px; | ||
} | ||
|
||
.message { | ||
background-color: antiquewhite; | ||
padding: 8px; | ||
height: 24px; | ||
width: 300px; | ||
border-radius: 0px 25px 25px 25px; | ||
} | ||
|
||
input { | ||
padding: 4px; | ||
height: 24px; | ||
width: 300px; | ||
} | ||
|
||
button { | ||
cursor: pointer; | ||
margin: 0 16px; | ||
padding: 12px; | ||
border: none; | ||
font-size: 16px; | ||
border-radius: 8px; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pourquoi passer par une variable intermédiaire alors qu'on a l'observable et le pipe async ?