Voici une petite explication de l'utilisation du Pipe async :
Le Pipe async souscrit à un Observable ou une Promise qui renvoie la dernière valeur qu'il a émise. Lorsqu'une nouvelle valeur est détectée, le canal asynchrone envoie un signale au component afin qu'il mette à jour la donnée.
Lorsque le component est détruit, le Pipe async se désinscrit automatiquement afin d'éviter les fuites de mémoire potentielles.
La syntaxe de la liste de todos :
<li *ngFor="let todo of (todos$ | async)?.data">
Cependant, en changeant l'argument du select('todos') par une fonction, on peut obtenir une syntaxe plus simplifiée :
<li *ngFor="let todo of todos$ | async">
this.todos$ = store.pipe(select((state) => state.todos.data)); // On cible directement la propriété data
Le Pipe et les opérateurs RXJS
Avant de continuer sur nos fonctions select, un point sur le Pipe RXJS s'impose.
Le Pipe permet de réaliser un chaînage d'opérateurs RXJS de manière plus lisible.
La fonction select de NGRX peut prendre une fonction en paramètre.
On peut donc déporter cette logique et la stocker dans un fichier dédié.
Grâce à la fonction createSelector, on pourra composer des sélecteurs à partir d'autres sélecteurs.
store/selectors/todo-list.selector.ts
import { createSelector } from '@ngrx/store';
// La première fonction amène vers le state todos
export const selectTodoListState$ = (state: AppState) => state.todos;
// Et à partir de celle-ci, on créer une autre fonction qui renverra data
export const selectTodos$ = createSelector(selectTodoListState$,(todos) => todos.data);
/app.component.ts
import { selectTodos } from 'store/selectors/todo-list.selector';
// [...]
// On remplace la fonction par le sélecteur
this.todos$ = store.pipe(select(selectTodos$));
Créer une todo
Utiliser un formulaire pour créer une todo grâce au FormsBuilder d'Angular.
La fonction createTodo renverra la future action de création dans le reducer.