Сначала вы должны изменить свой сервис и использовать HttpClient
внутри HttpClientModule
.
export class PostService {
constructor(private httpClient: HttpClient) {};
getAllPosts(): Observable<Post[]> {
return this.httpClient.get<Post[]>('https://jsonplaceholder.typicode.com/posts');
}
}
Также важно правильно импортировать HttpClientModule
, а CommonModule
- если вы используете дочерние модули. Общие директивы, такие как async
, не будут доступны, если вы не импортируете их.
@NgModule({
imports:[
CommonModule,
HttpClientModule,
...
Тогда у вас есть несколько вариантов получения и отображения вашего результата, вот 2 основных варианта:
Опция 1
@Component({
templateUrl: './post-list.component.html',
})
export class PostList {
posts: Post[] = [];
errorMessage: string;
constructor(private postService: PostService) {}
ngOnInit() {
this.posts = this.postService.getAllPosts().subscribe(
posts => {
this.posts = posts
},
error => {
this.errorMessage = error;
}
);
}
}
Опция 2 (рекомендуется)
@Component({
templateUrl: './post-list.component.html',
})
export class PostList {
posts$: Observable<Post[]>;
errorMessage: string;
constructor(private postService: PostService) {}
ngOnInit() {
this.posts$ = this.postService.getAllPosts().pipe(
catchError(error => {
this.errorMessage = error;
});
);
}
}
шаблон. html:
<div *ngFor="let post of posts$ | async">
<p>{{ post.userId }}</p>
...
</div>
См. обновленная демонстрация stackblitz для этого рекомендуемого варианта с трубами Observable
и async
.