Je suis nouveau sur Angular2 et Observable, je veux vérifier si un observable getRoles
qui est de type Observable<string[]>
contient une chaîne.
public hasRole(name: string): boolean {
// getRoles is of type Observable<string[]>
let getRoles = this.tokenService.getTokenInformation().map(element => element.roles);
if (/* check if name is inside of getRoles */) {
return true;
}
return false;
}
Réponses:
2 pour la réponse № 1Les observables sont asynchrones, vous ne pouvez donc pas utiliser let getRoles = ...map(...)
. le map()
La méthode n'est pas exécutée sur un tableau, mais sur un observable toujours asynchrone.
Donc, la bonne façon de le faire pourrait être (je n’ai pas testé ce code):
public hasRole(name: string): Observable {
return this.tokenService.getTokenInformation()
.map(element => element.roles)
.first(roles => roles.indexOf(name) !== -1);
}
Opérateur first()
émet une erreur lorsqu'aucun élément correspondant n'a été trouvé lorsque la source est terminée (lorsque nous avons itéré tous les rôles).
Ensuite, utilisez cette méthode comme:
hasRole("my-role").subscribe(
role => console.log("has role"),
error => console.log("doesn"t have role"),
)
Modifier:
Ceci convertit tout en seulement true
ou false
valeurs. Voir doc pour first()
opérateur quels sont ces arguments. Puis j'ai utilisé map()
forcer tout convertir en booléen.
public hasRole(name: string): Observable {
return this.tokenService.getTokenInformation()
.map(element => element.roles)
.first(roles => roles.indexOf(name) !== -1, undefined, false)
.map(val => !!val);
}
Voir la démo simplifiée en direct: http://plnkr.co/edit/MtYfGLgqgHACPswFTVJ5