J'ai un seul service, qui renvoie un seul observable. Maintenant, je cherche la manière correcte/la plus efficace d'obtenir plusieurs résultats de cet Observable sans écrire trop de code.Angular2 + pipe asynchrone: Obtenir plusieurs valeurs d'un seul observale
MyService
renvoie unObservable<Array<Foo>>
MyComponent
appelsmyService.getFoos()
et doit fournir en sortie les 5 premiers éléments de la matrice, et la longueur totale de la matrice, et le nombre d'éléments non représentés.
Voici mon code actuel:
@Injectable()
export class MyService {
foos = new BehaviorSubject<Array<Foo>>([]);
getFoos() {
return this.foos.asObservable();
}
}
@Component({
template: `
Total: {{ totalCount | async }}
Omitted: {{ (totalCount | async) - (maxFiveItems | async).length }}
<div *ngFor="let item of maxFiveItems | async">
{{item.bar}}
</div>
`
})
export class MyComponent {
totalCount: Observable<number>;
maxFiveItems: Observable<Array<Foo>>;
constructor(myService:MyService) {
this.totalCount = myService.getFoos()
.map(arr => arr.length);
this.maxFiveItems = myService.getFoos()
.map(arr => arr.slice(0, 5));
}
}
Le résultat a l'air bien, mais je suis en utilisant le tuyau async
4 fois. Lequel (pour autant que je sache) entraînera 4 abonnements. Cela ne devrait pas être nécessaire à tout ce que je suppose que (?)
Bien sûr, je pourrais souscrire manuellement dans le constructor
de MyComponent
puis vivre sans async
tuyaux. Mais alors je dois prendre soin de me désinscrire moi-même.
Existe-t-il un autre moyen de gérer cela?
Je ne comprends pas pourquoi vous devriez utiliser 'share' sur un' BehaviorSubject'. En ce qui concerne la désabonnement, si vous vous abonnez manuellement à quelque chose qui peut émettre plus d'une valeur (c'est le cas pour un sujet de comportement), vous devez vous désabonner. Sinon, vous obtenez une fuite de mémoire. Fondamentalement, vous devriez implémenter l'interface 'OnDestroy' dans votre composant. – Melou
Appart de cela, je suis d'accord avec vous: approche @Benjamin semble parfaitement bien. – Melou
Je viens de lire à propos d'une prochaine fonctionnalité dans Angular 4: ** ngIf avec tuyau async et let ** (voir: https://netbasal.com/a-taste-from-angular-version-4-50be1c4f3550). Cela pourrait résoudre certains de ces scénarios d'abonnement multiple. –