У меня есть одна служба, которая возвращает одиночный наблюдаемый. Теперь я ищу правильный/самый эффективный способ получить несколько результатов из этого Observable без написания слишком большого кода.Angular2 + async pipe: получить несколько значений из одного Observale
MyService
возвращаетObservable<Array<Foo>>
MyComponent
вызовыmyService.getFoos()
и должен вывести первые 5 элементов из массива, а общая длина массива, а число элементов не показаны.
Вот мой текущий код:
@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));
}
}
Результат выглядит хорошо, но я использую async
трубу 4 раза. Что (насколько я знаю) приведет к 4 Подписям. Это не должно быть нужно вообще я думаю (?)
Конечно, я мог бы вручную подписываться в constructor
из MyComponent
, а затем жить без async
труб. Но тогда я должен позаботиться о том, чтобы отказаться от подписки.
Есть ли другой способ справиться с этим?
Я не понимаю, почему вы должны использовать 'share' в' BehaviorSubject'. Что касается отмены подписки, если вы вручную подписываетесь на то, что может испускать более одного значения (это относится к теме поведения), вам необходимо отказаться от подписки. В противном случае вы получите утечку памяти. В основном вы должны были бы реализовать интерфейс 'OnDestroy' в своем компоненте. – Melou
Appart from the, я согласен с вами: подход @Benjamin кажется совершенно хорошим. – Melou
Я только что прочитал о предстоящей функции в Angular 4: ** ngIf с асинхронной трубкой и пусть ** (см. Https://netbasal.com/a-taste-from-angular-version-4-50be1c4f3550). Это может решить некоторые из этих сценариев с несколькими подписками. –