Работа с данными из наблюдаемого в компоненте в Angular 6

Я не уверен, правильно ли сформулировал этот вопрос, поэтому прошу прощения за неуклюжие формулировки. Я относительно новичок в 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 для этого приложения, я хочу просто выяснить, как отображать данные, которые я все еще не могу сделать, и это сводит меня с ума. Заранее благодарю за помощь.

попробуйте this.posts = data.posts

Pengyy 23.05.2018 03:40
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
1
1 908
1

Ответы 1

Ваш возвращаемый JSON - это объект, в котором fieldсообщения содержит ваш необходимый данные массива, поэтому просто возьмите поле posts из ответа вашего сервера и отобразите такой массив сообщений. Что-то вроде этого:

ngOnInit() {
    this.postService.getPosts()
      .subscribe(data => this.posts = data.posts);
  }

Для лучшего набора текста вы всегда можете указать свой тип переменной, например, public posts: Post[], тогда у вас будет проверка типа при кодировании.

Спасибо за ответ! К сожалению, изменение сообщений на data.posts приводит к ошибке: `Property 'posts' не существует для типа 'Post []'." `

E. Max 23.05.2018 05:28

Эта ошибка является частью проверки типа. Как вы знаете и убедитесь, что данные ответа представляют собой массив типа Post, тогда вы можете В ролях ваших данных в таком типе. Примерно так: data => this posts = <Post []> data.posts

sugarme 23.05.2018 06:10

Нет, проблема с текущей типизацией заключается в том, что ответ на HTTP-запрос уже неправильно введен в Post [].

Ingo Bürk 23.05.2018 06:46

@ IngoBürk это решило, спасибо! Я изменил Observable в функции getPosts () на тип <any>. Мне интересно, есть ли вообще смысл использовать наблюдаемое, из того, что я понимаю, это просто то, что используют новые версии Angular (я использую Angular 6).

E. Max 23.05.2018 07:24

@ E.Max I, поскольку ваш HTTP-запрос по своей природе является асинхронный, необходима наблюдаемая реализация.

sugarme 23.05.2018 07:35

@ E.Max вы набрали запрос на возврат <Post[]>, но на самом деле он возвращает <{ posts: Post[]; }>, попробуйте это вместо <any>.

William Lohan 03.07.2018 23:01

Другие вопросы по теме