J'ai un service avec un sujet:
@Injectable() export class UserService() {
private currentUserSubject = new BehaviorSubject<User>(null);
public currentUser = this.currentUserSubject.asObservable().distinctUntilChanged();
... // emitting new User
}
Avoir un composant dans lequel j'injecte ce service et m'abonne aux mises à jour:
@Component() export class UserComponent {
constructor(private userService: UserService) {
this.userService.currentUser
.subscribe((user) => {
// I want to see not null value here
})
}
}
Je veux appliquer quelque chose à Observable<User>
pour filtrer toutes les valeurs nulles et entrer dans l'abonnement uniquement lorsque User
est réellement chargé.
Ajoutez un opérateur de filtre à votre chaîne observable. Vous pouvez filtrer les valeurs nulles explicitement ou simplement vérifier que votre utilisateur est véridique - vous devrez effectuer cet appel en fonction de vos besoins.
Filtrage des utilisateurs nuls uniquement:
public currentUser = this.currentUserSubject
.asObservable()
.filter(user => user !== null)
.distinctUntilChanged();
Une autre façon de vérifier la valeur existe
public currentUser = this.currentUserSubject
.asObservable()
.filter(Boolean)
.distinctUntilChanged();
avec rxjs@6
et TypeScript, la méthode recommandée (lisible/maintenable) consiste à définir la protection de type suivante:
export function isNonNull<T>(value: T): value is NonNullable<T> {
return value != null;
}
et augmentez un sujet avec pipe
et filter
:
subject.pipe(filter(isNonNull))