angular - Returnera vid prenumeration. ... Typen 'Subscription' saknar följande egenskaper
Jag prenumererar på ett svar från en Angular-tjänst:
books: BookModel[] = [];
constructor(private bookService: BookService) { }
ngOnInit() {
this.books = this.getBooks();
}
getBooks(): BookModel[] {
return this.bookService.getByCategoryId(1).subscribe((payload: Payload<GetBooksResponse>) => {
return payload.result.map((response: GetBooksResponse) => {
return {
id: response.id,
title: response.title
};
});
});
}
När jag lägger till return till this.bookService, t.ex. return this.bookService får jag felet:
Type 'Subscription' is missing the following properties from type 'BookModel[]': length, pop, push, concat, and 26 more.
Hur kan jag använda return för att få detta att fungera?
Uppdatering: BookModel:
export interface BookModel {
id: number;
title: string;
}
Svar #1
Du försöker tilldela en prenumeration till en matris, det är därför du får dessa fel:
Jag gjorde detta exempel med Observables och async-pipe, jag hoppas det hjälper dig:
TS :
/***
* books$ Observable is looking to any response
* of the method getByCategoryId. It is being displayed with async pipe in the view.
*/
books$ = this.bookService.getByCategoryId(1);
books: BookModel[];
constructor(private bookService: BookService) { }
ngOnInit() {
this.getBooks();
}
/***
* Getbooks method does not return anything,
* after the subscribe, a map is assigning the value to the books propertie
* which is in being render in the view without async pipe.
*/
getBooks(): void {
this.bookService.getByCategoryId(1)
.subscribe((payload: Payload<GetBooksResponse>) => {
this.books = payload.result.map((response: GetBooksResponse) => {
return <BookModel>{
id: response.id,
title: response.title
};
});
});
}
HTML :
<div *ngFor="let book of (books$ | async).result">
{{ book | json }}
</div>
<br/>
<h3> Not Using | async </h3>
<div *ngFor="let book of books">
{{ book | json }}
</div>
Prova online på denna länk: https://stackblitz.com/edit/angular-k9pzmw
Om du frågar mig vilken metod som är bättre, skulle jag säga att det beror.
Async-pipe med observable är min favorit för att bara visa 'dum data' i vyn, men du bör behålla prenumerationslösningen om du behöver denna information i komponenten för något annat.
Svar #2
Du behöver återvända
getBooks(): Observable<BookModole[]> { ... }
då :
this.getBooks().subscribe(res => { this.books = res; });
