Не удается найти другой вспомогательный объект «[object Object]» типа «object». NgFor поддерживает только привязку к Iterables, например к ошибке Arrays

Бэкэнд (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>

Можете ли вы показать структуру вашего ответа в формате json?

jess 27.05.2019 15:19

Можете ли вы показать объект data

Adrita Sharma 27.05.2019 15:19

Структура в формате JSON, просто я использую Spring REST (JPA), и она немного отличается. firstName":"Пицца Маргарита", "description":"Ингредиенты Маргариты"

Encrypter 27.05.2019 15:35

0: {firstName: "Пицца Маргарита", description: "Ингредиенты Маргариты", _links: {…}} 1: {firstName: "Детройт Пицца", description: "Ингредиенты Detroit Pizza", _links: {…}} 2 : {firstName: «Греческая пицца», description: «Ингредиенты греческой пиццы», _links: {…}} 3: {firstName: «Сицилийская пицца», description: «Ингредиенты сицилийской пиццы», _links: {…}} 4 : {firstName: "Пицца Чикаго", описание: "Ингредиенты пиццы Чикаго", _links: {…}}

Encrypter 27.05.2019 15:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
520
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы ожидаете массив объектов, но я думаю, что вы получаете от сервера объект со свойством 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)

карта выдает ошибку (не удается найти имя «карта». Вы имели в виду «карта»?) есть идеи, как это исправить? Да, ты прав, я получил объект вместо того, что ожидал

Encrypter 27.05.2019 15:10

Если вы используете более новую версию rxjs, вы должны импортировать ее следующим образом: import { map } from 'rxjs/operators';

Dániel Barta 27.05.2019 15:12

Спасибо, но теперь появилось кое-что еще, data.pizzas (свойство «пиццы» не существует для типа «Объект»). Кроме того, теперь он даже не отображается в consoleLog. Я изучу этот вопрос, если найду какое-либо решение.

Encrypter 27.05.2019 15:28

Тогда действительно проблема в том, что то, что вы получаете от сервера, не является массивом. Я отредактировал свой ответ, надеюсь, он поможет вам в отладке.

Dániel Barta 27.05.2019 15:32

Большое спасибо, я ценю ваше время, моя проблема теперь стала ясной, как говорится, шаг к решению - это сначала понять, что у вас есть проблема, и я знаю, что это такое, все, что мне нужно сейчас понять, это отобразить свойства объекта .

Encrypter 27.05.2019 15:55

Каждый возврат данных с использованием 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>

Надеюсь, это поможет вашей проблеме.

Большое спасибо, Джесс, я с нетерпением жду этого в качестве ссылки на будущее.

Encrypter 28.05.2019 17:53

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