Бэкэнд (Spring Boot, REST (Spring Data Rest, Spring Data JPA). Это происходит только с JPA, без него работает отлично, но для написания гораздо больше кода).
Я попробовал все оставшиеся ответы, но не получил точного решения.
Бэкэнд API
New File
pizzatest.model.ts
export class Pizzas{
firstName: string;
description: string;
}
API BELOW
_embedded
pizzas
0
firstName "Pizza Margarita"
description "Ingredients of Margarita"
_links
self
href "http://localhost:8080/pizzas/1"
pizza
href "http://localhost:8080/pizzas/1"
1
firstName "Detroit Pizza"
description "Ingredients of Detroit Pizza"
_links
self
href "http://localhost:8080/pizzas/2"
pizza
href "http://localhost:8080/pizzas/2"
2
firstName "Greek Pizza"
description "Ingredients of Greek Pizza"
_links
self
href "http://localhost:8080/pizzas/3"
pizza
href "http://localhost:8080/pizzas/3"
3
firstName "Sicilian Pizza"
description "Ingredients of Sicilian Pizza"
_links
self
href "http://localhost:8080/pizzas/4"
pizza
href "http://localhost:8080/pizzas/4"
4
firstName "Chicago Pizza"
description "Ingredients of Chicago Pizza"
_links
self
href "http://localhost:8080/pizzas/5"
pizza
href "http://localhost:8080/pizzas/5"
_links
self
href "http://localhost:8080/pizzas{?page,size,sort}"
templated true
profile
href "http://localhost:8080/profile/pizzas"
page
size 20
totalElements 5
totalPages 1
number 0
ОКАЗАНИЕ УСЛУГ
import { Injectable } from '@angular/core';
import{HttpClient} from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class PizzatestService {
readonly rootUrl = 'http://localhost:8080/'
constructor(private http: HttpClient) { }
getPizzas(){
return this.http.get(this.rootUrl + '/pizzas');
}}
МАШИНОПИСЬ
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { PizzatestService } from './pizzatest.service';
import {Pizzas} from './pizzatest.model';
@Component({
selector: 'app-pizzatest',
templateUrl: './pizzatest.component.html',
styleUrls: ['./pizzatest.component.css']
})
export class PizzatestComponent implements OnInit {
pizzas : Pizzas[]
constructor(private pizzaTestService: PizzatestService) { }
ngOnInit() {
this.pizzaTestService.getPizzas().subscribe((data: any) => {
console.info('from service', data)
this.pizzas = data;
})
}
}
HTML
<div *ngFor = "let pizza of pizzas">
<ul>
<li> {{pizza.firstName}}</li>
<li> {{pizza.description}}</li>
</ul>
</div>
Можете ли вы показать объект data
Структура в формате JSON, просто я использую Spring REST (JPA), и она немного отличается. firstName":"Пицца Маргарита", "description":"Ингредиенты Маргариты"
0: {firstName: "Пицца Маргарита", description: "Ингредиенты Маргариты", _links: {…}} 1: {firstName: "Детройт Пицца", description: "Ингредиенты Detroit Pizza", _links: {…}} 2 : {firstName: «Греческая пицца», description: «Ингредиенты греческой пиццы», _links: {…}} 3: {firstName: «Сицилийская пицца», description: «Ингредиенты сицилийской пиццы», _links: {…}} 4 : {firstName: "Пицца Чикаго", описание: "Ингредиенты пиццы Чикаго", _links: {…}}
Вы ожидаете массив объектов, но я думаю, что вы получаете от сервера объект со свойством pizzas
. Попробуйте так:
getPizzas(){
return this.http.get(this.rootUrl + '/pizzas')
.pipe(map(data => data.pizzas));
}}
Вы можете проверить, что вы получаете от сервера, используя
getPizzas(){
return this.http.get(this.rootUrl + '/pizzas')
.pipe(tap(console.info));
}}
(Вы можете импортировать tap
так же, как и с map
)
карта выдает ошибку (не удается найти имя «карта». Вы имели в виду «карта»?) есть идеи, как это исправить? Да, ты прав, я получил объект вместо того, что ожидал
Если вы используете более новую версию rxjs, вы должны импортировать ее следующим образом: import { map } from 'rxjs/operators';
Спасибо, но теперь появилось кое-что еще, data.pizzas (свойство «пиццы» не существует для типа «Объект»). Кроме того, теперь он даже не отображается в consoleLog. Я изучу этот вопрос, если найду какое-либо решение.
Тогда действительно проблема в том, что то, что вы получаете от сервера, не является массивом. Я отредактировал свой ответ, надеюсь, он поможет вам в отладке.
Большое спасибо, я ценю ваше время, моя проблема теперь стала ясной, как говорится, шаг к решению - это сначала понять, что у вас есть проблема, и я знаю, что это такое, все, что мне нужно сейчас понять, это отобразить свойства объекта .
Каждый возврат данных с использованием HttpClient осуществляется в формате объекта Json. Например:
Вот пример кода, который вы можете попробовать.
Вы можете попробовать сопоставить свои данные внутри service.ts:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, Subject, ReplaySubject, from, of, range } from 'rxjs';
import 'rxjs/add/operator/map';
@Injectable()
export class DataloadService {
constructor(private http: HttpClient) { }
LoadData(): Observable<any> {
return this.http.get('https://jsonplaceholder.typicode.com/users')
.map(this.extractData)
}
private extractData(res: Response) {
let body = res;
return body;
}
}
Вот app.component.ts:
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {DataloadService} from './dataload.service';
import { Observable, Subject, ReplaySubject, from, of, range } from 'rxjs';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
dataFromServer: Observable<any>;
constructor(private load: DataloadService) {}
getDataServer() {
let obj = this.load.LoadData();
obj.subscribe(data => {this.dataFromServer = data;
console.info("data:", data);
})
};
ngOnInit() {this.getDataServer();}
}
HTML-файл:
<h2>My Awesome Table:</h2>
<table *ngIf = "dataFromServer">
<tr>
<th>ID</th>
<th>Name</th>
<th>Username</th>
<th>Email</th>
</tr>
<tr *ngFor = "let data of dataFromServer">
<td>{{data.id}}</td>
<td>{{data.name}}</td>
<td>{{data.username}}</td>
<td>{{data.email}}</td>
</tr>
</table>
Надеюсь, это поможет вашей проблеме.
Большое спасибо, Джесс, я с нетерпением жду этого в качестве ссылки на будущее.
Можете ли вы показать структуру вашего ответа в формате json?