Я не уверен, правильно ли сформулировал этот вопрос, поэтому прошу прощения за неуклюжие формулировки. Я относительно новичок в angular, но мне довольно удобно делать HTTP-запросы и работать с данными в других фреймворках (например, VueJS). Я начинаю понимать Наблюдаемые, который использует angular. Я пытаюсь создать приложение для блога, и у меня есть серверная часть Express с JSON для сообщений в блоге.
В моем post.service.ts у меня есть:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { Post } from '../post';
@Injectable({
providedIn: 'root'
})
export class PostService {
private apiUrl = 'http://localhost:8081/posts';
getPosts(): Observable<Post[]> {
return this.http.get<Post[]>(this.apiUrl);
}
constructor( private http: HttpClient,
private postService: PostService ) { }
}
И затем я хочу перечислить все сообщения в моем post-list.component.ts:
import { Component, OnInit } from '@angular/core';
import { PostService } from '../../services/post.service'
import { Post } from '../../post';
@Component({
selector: 'app-post-list',
templateUrl: './post-list.component.html',
styleUrls: ['./post-list.component.css']
})
export class PostListComponent implements OnInit {
public posts = [];
constructor(private postService: PostService) { }
ngOnInit() {
this.postService.getPosts()
.subscribe(data => this.posts = data);
}
}
Но массив сообщений становится объектом, и я не уверен, как использовать его в качестве массива. Если я попытаюсь использовать метод *ngFor, я получаю сообщение об ошибке. На странице отображается [объект Object], если я помещаю {{posts}} в html. Если я использую {{posts | json}}, он показывает фактический JSON, но я все еще не могу повторить его.
Вот как выглядит json:
{
"posts": [
{
"_id": "5b04b269fde3ca29b35ffc3e",
"name": "Mike",
"title": "Stuff",
"post": "This is a post about stuff"
},
{
"_id": "5b04b24dfde3ca29b35ffc3d",
"name": "OtherUser",
"title": "New Post Test",
"post": "This is a test post"
},
{
"_id": "5b02ed783aa641758c08e601",
"name": "Emerjawn",
"title": "Post"
}
]
}
Прежде чем я попытаюсь настроить CRUD для этого приложения, я хочу просто выяснить, как отображать данные, которые я все еще не могу сделать, и это сводит меня с ума. Заранее благодарю за помощь.

Ваш возвращаемый JSON - это объект, в котором fieldсообщения содержит ваш необходимый данные массива, поэтому просто возьмите поле posts из ответа вашего сервера и отобразите такой массив сообщений. Что-то вроде этого:
ngOnInit() {
this.postService.getPosts()
.subscribe(data => this.posts = data.posts);
}
Для лучшего набора текста вы всегда можете указать свой тип переменной, например, public posts: Post[], тогда у вас будет проверка типа при кодировании.
Спасибо за ответ! К сожалению, изменение сообщений на data.posts приводит к ошибке: `Property 'posts' не существует для типа 'Post []'." `
Эта ошибка является частью проверки типа. Как вы знаете и убедитесь, что данные ответа представляют собой массив типа Post, тогда вы можете В ролях ваших данных в таком типе. Примерно так: data => this posts = <Post []> data.posts
Нет, проблема с текущей типизацией заключается в том, что ответ на HTTP-запрос уже неправильно введен в Post [].
@ IngoBürk это решило, спасибо! Я изменил Observable в функции getPosts () на тип <any>. Мне интересно, есть ли вообще смысл использовать наблюдаемое, из того, что я понимаю, это просто то, что используют новые версии Angular (я использую Angular 6).
@ E.Max I, поскольку ваш HTTP-запрос по своей природе является асинхронный, необходима наблюдаемая реализация.
@ E.Max вы набрали запрос на возврат <Post[]>, но на самом деле он возвращает <{ posts: Post[]; }>, попробуйте это вместо <any>.
попробуйте
this.posts = data.posts