Практическое правило написания любого сервиса на английском языке заключается в том, что если у вас есть .subscribe()
внутри вашего сервиса, вы, вероятно, (99%) делаете это неправильно.Всегда возвращайте и Observable
, и пусть ваш компонент выполняет .subscribe()
.
. Причина, по которой ваш код не работает, заключается в том, что вы сначала подписываете свои данные внутри службы, изатем повторно оберните это, используя Observable.of()
.Это не сработает, потому что ваш http
вызов асинхронный.К тому времени, когда ваша подписка внутри вашего конструктора получит излучение, ваш connect
уже давно установлен и this.data
сначала не определен, прежде чем ему могут быть присвоены какие-либо значения.
Чтобы решить вашу проблему, просто измените of(this.data)
к исходному Observable
источнику, и все работает:
connect(): Observable<DynamoTableItem[]> {
// Combine everything that affects the rendered data into one update
// stream for the data-table to consume.
const dataMutations = [
this.dynamoService.getData(this.params),
this.paginator.page,
this.sort.sortChange
];
// Set the paginators length
this.paginator.length = this.data.length;
return merge(...dataMutations).pipe(map((received) => {
return this.getPagedData(this.getSortedData([...received]));
}));
}
Вот рабочий рабочий StackBlitz