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

Я посмотрел на похожие вопросы, но ни один из них мне не помог. Я собираюсь получить объект вроде следующего:

[
  {
    "id": 1,
    "name": "Safa",
    "email": "[email protected]",
    "purpose": "thesis",
    "programme": "Software Engineering",
    "year": 2016,
    "language": "Estonian",
    "comments": "In need of correcting a dangling participle.",
    "status": "RECEIVED"
  },
  {
    "id": 2,
    "name": "Safa",
    "email": "[email protected]",
    "purpose": "thesis",
    "programme": "Software Engineering",
    "year": 2016,
    "language": "Estonian",
    "comments": "In need of correcting a dangling participle.",
    "status": "RECEIVED"
  },
  {
    "id": 3,
    "name": "Salman",
    "email": "[email protected]",
    "purpose": "thesis",
    "programme": "Software Engineering",
    "year": 2016,
    "language": "Estonian",
    "comments": "In need of correcting a dangling participle.",
    "status": "RECEIVED"
  }
]

и вот мой http-сервис для его получения:

getRequest(){
        return this._http.get("http://consultationwebserver.herokuapp.com/requests").map(res => res.json());
    }

и, наконец, я вызвал службу таким образом:

requests;
    constructor(private _http:requestService){}
    ngOnInit(){
        this.requests=this._http.getRequest().subscribe(res=>this.requests=res);
    }

К сожалению, когда страница загружается, она жалуется на:

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

Итак, что не так с этим кодом?


person Jeff    schedule 02.10.2016    source источник
comment
Пожалуйста, добавьте код вашего шаблона там, где вы используете этот объект.   -  person Madhu Ranjan    schedule 02.10.2016


Ответы (17)


Там вам не нужно использовать this.requests=, когда вы делаете get вызов (тогда requests будет иметь наблюдаемую подписку). Вы получите ответ в виде наблюдаемого success, поэтому успешная установка значения requests имеет смысл (что вы уже делаете).

this._http.getRequest().subscribe(res=>this.requests=res);
person Pankaj Parkar    schedule 02.10.2016
comment
Это не решение для вышеупомянутой ошибки (не удается найти другой поддерживающий объект '[object Object]' типа 'object'.) Он должен использовать dataType, например: requests: any=[] Даже я столкнулся с тем же, и я исправил, добавив dataType - person kva; 05.09.2018
comment
Согласовано @kva, ошибка выдается только тогда, когда не удается отобразить элементы объекта. - person Richard Pariath; 25.10.2018
comment
в основном NgFor работает только с повторяемыми элементами, такими как массивы. если вы объявляете словарный запас и пытаетесь использовать * ngfor, это приведет к ошибкам такого типа. например, когда вы объявляете массив как this.myArray = {} .. возникнет проблема .. это должно быть this.myArray = []. чем проблема решит. - person VSN; 29.10.2020

Удалить this.requests из

ngOnInit(){
  this.requests=this._http.getRequest().subscribe(res=>this.requests=res);
}

to

ngOnInit(){
  this._http.getRequest().subscribe(res=>this.requests=res);
}

this._http.getRequest() возвращает подписку, а не значение ответа. Значение ответа присваивается обратным вызовом, переданным в subscribe(...)

person Günter Zöchbauer    schedule 02.10.2016
comment
Есть идеи, как показать ответ в консоли? Когда я делаю console.log (this.requests), я получаю объект подписчика - person Ali Sadiq; 13.03.2017

Вы можете объявить книги (в строке 2) как массив:

title: any = 'List of books are represted in the bookstore';
books: any = []; 
constructor(private service:  AppService){
}

ngOnInit(){
  this.getBookDetails();
}

getBookDetails() {
    this.service.getBooks().subscribe(books => {
        this.books = books.json();
        console.log(this.books);
    });
}
person Raj Kumar    schedule 24.08.2017
comment
В вопросе не упоминается books. - person Günter Zöchbauer; 24.08.2017
comment
должен сказать, что это помогло, поскольку я инициализировал свой массив как products = {} и должен был сделать products:any = [], так как *ngFor 1-й работал на пустом object, который он не может - person bresleveloper; 02.10.2017
comment
@bresleveloper то же самое со мной .. спасибо, что указали на это .. это также решило мою проблему .. :) - person kaluva; 06.07.2018

У меня была такая же ошибка, потому что я сопоставил ответ HTTP следующим образом:

this.http.get(url).map(res => res.json);

Обратите внимание, как я случайно вызвал .json как переменную, а не как метод.

Изменив его на:

this.http.get(url).map(res => res.json());

сделали свое дело.

person Christoph    schedule 18.12.2016
comment
Моя проблема в том, что я не обернул свой ответ с сервера «данными», как рекомендовано в руководстве по angular 2 hero. - person Tzach Solomon; 08.03.2017

В вашем файле JSOn внесите следующие изменения.

 {
    "data":
    [
      {
        "id": 1,
        "name": "Safa",
        "email": "[email protected]",
        "purpose": "thesis",
        "programme": "Software Engineering",
        "year": 2016,
        "language": "Estonian",
        "comments": "In need of correcting a dangling participle.",
        "status": "RECEIVED"
      },
      {
        "id": 2,
        "name": "Safa",
        "email": "[email protected]",
        "purpose": "thesis",
        "programme": "Software Engineering",
        "year": 2016,
        "language": "Estonian",
        "comments": "In need of correcting a dangling participle.",
        "status": "RECEIVED"
      },
      {
        "id": 3,
        "name": "Salman",
        "email": "[email protected]",
        "purpose": "thesis",
        "programme": "Software Engineering",
        "year": 2016,
        "language": "Estonian",
        "comments": "In need of correcting a dangling participle.",
        "status": "RECEIVED"
      }
    ]
    }

И после этого:

 this.http.get(url).map(res:Response) => res.json().data);

Данные на самом деле являются именем коллекции tge файла json. Пожалуйста, попробуйте приведенный выше код, я уверен, что он сработает.

person vivekinall    schedule 10.11.2017

Мое решение - создать канал для возврата массива значений или объекта свойств.

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'valueArray',
})
export class ValueArrayPipe implements PipeTransform {

  // El parametro object representa, los valores de las propiedades o indice
  transform(objects : any = []) {
    return Object.values(objects);
  }
}

Реализация шаблона

<button ion-item *ngFor="let element of element_list | valueArray" >
    {{ element.any_property }}
</button> 
person Ivan Fretes    schedule 17.01.2018

Если вы столкнулись с этой проблемой и попали сюда через Google, убедитесь, что элемент host в директиве *ngFor указан правильно. Под этим я подразумеваю, что я столкнулся с этой ошибкой и потратил много времени на поиск исправлений, прежде чем понял, что я поставил *ngFor на элемент ng-template, а не на свой компонент, который я хотел повторить.

Неправильно

<ng-template *ngFor=let group of groups$ | async" ...>
  <my-component [prop1]="group.key" ... </my-component>
<\ng-template>

Верно

<my-component *ngFor=let group of groups$ | async" [prop1]="group.key" ... </my-component>

Оглядываясь назад, я знаю, что это очевидная ошибка, но я надеюсь, что ответ здесь избавит кого-то от головной боли, которая у меня сейчас есть.

person Pflugs    schedule 06.09.2019

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

{brands: Array(5), _id: "5ae9455f7f7af749cb2d3740"} 

убедитесь, что ваши данные - МАССИВ, а не ОБЪЕКТ, содержащий массив. только массив выглядит так -,

(5) [{…}, {…}, {…}, {…}, {…}]

это решило мою проблему.

person Sushil    schedule 10.05.2018

Чтобы перебрать объект, имеющий формат json, как показано ниже

{
  "mango": { "color": "orange", "taste": "sweet" }
  "lemon": { "color": "yellow", "taste": "sour" }
}
  1. Присвойте его переменной

    let rawData = { "mang":{...}, "lemon": {...} }

  2. Создайте пустой массив (ы) для хранения значений (или ключей)

    let dataValues = []; //For values

    let dataKeys = []; //For keys

  3. Переберите ключи и добавьте значения (и ключи) к переменным

    for(let key in rawData) { //Pay attention to the 'in' dataValues.push(rawData[key]); dataKeys.push(key); }

  4. Теперь у вас есть массив ключей и значений, которые вы можете использовать в * ngFor или в цикле for.

    for(let d of dataValues) { console.log("Data Values",d); }

    <tr *ngFor='let data of dataValues'> ..... </tr>

person Nandu Dharmapalan    schedule 02.10.2018

я столкнулся с той же проблемой

мой начальный json

{"items":

         [
           {"id":1,
            "Name":"test4"
           },
           {"id":2,
            "Name":"test1"
           }
         ]
}

я изменил свой json внутри []

[{"items":

         [
           {"id":1,
            "Name":"test4"
           },
           {"id":2,
            "Name":"test1"
           }
         ]
}]
person Lijo    schedule 09.02.2018

Вы должны использовать асинхронный канал. Документ: https://angular.io/api/common/AsyncPipe.

Например:

<li *ngFor="let a of authorizationTypes | async"[value]="a.id">
     {{ a.name }}
</li>
person Mati Paz Wasiuchnik    schedule 19.02.2019
comment
Такой подход решил мою проблему. Это было до того, как я прочитал этот ответ, но стоит сообщить другим, что ваш подход работает. Спасибо. - person P.M; 27.07.2019

this.requests=res здесь вы пытаетесь назначить объекту следующий ответ,

{"headers":{"normalizedNames":{},"lazyUpdate":null},"status":200,"statusText":"OK",
"url":"xyz","ok":true,"type":4,"body":[{}]}

Поскольку формат объекта отличается от формата ответа, вам необходимо присвоить res.body часть вашего ответа, чтобы получить необходимое содержимое.

person atish shimpi    schedule 16.07.2018

<ul>
<li *ngFor = "let Data of allDataFromAws  | async">
  <pre> {{ Data | json}}</pre>
</li>
</ul>

используйте async для преобразования allDataFromAws в объект массива ....

person jasraj    schedule 24.10.2018

Просто объявите var как массив, в котором вы храните данные, у меня это сработало.

listingdata:Array<any> = [];
this.listingdata = data.results.rows;

и зациклить данные листинга на странице html

person Rakesh Pandey    schedule 21.05.2019

Вот решение.

Когда вы получаете массив из своей базы данных. и вы храните данные массива внутри переменной, но переменная определена как объект. На этот раз вы получите ошибку.

Я получаю массив из базы данных и помещаю этот массив в переменную «bannerliders». Тип 'bannerliders' теперь 'любой', но если вы пишете 'bannerliders' - это объект. Как баннеры: any = {}. Итак, на этот раз вы храните данные массива внутри переменной типа объекта. Итак, вы нашли эту ошибку.

Таким образом, вы должны написать переменную, например, "bannerliders: any;" или 'bannerliders: any = []'.

Вот пример.

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
bannersliders:any;
  getallbanner(){
    this.bannerService.getallbanner().subscribe(data=>{
      this.bannersliders =data;
   })
  }

person Anirudha Bhowmik    schedule 21.08.2020

Если вы используете Spring boot с Angular; убедитесь, что если вы создаете по умолчанию

person cmyldz    schedule 05.11.2018
comment
убедитесь, что вы должны использовать конструктор по умолчанию - person cmyldz; 05.11.2018

*********** РАЗБОР РЕЗУЛЬТАТА ДО ОБЪЕКТА JSON: JSON.prase (result.arrayOfObjects) ***********

Я зашел на эту страницу после того, как столкнулся с этой проблемой. Итак, моя проблема заключалась в том, что сервер отправляет массив объектов в виде строки. Это примерно так:

когда я напечатал результат на консоли после получения с сервера, это строка:

'arrayOfObject': '[
                  {'id': '123', 'designation': 'developer'},
                  {'id': '422', 'designation': 'lead'}
               ]'

Итак, я должен преобразовать эту строку в JSON после ее получения с сервера. Используйте метод для анализа строки результата, которую вы получаете от сервера:

JSON.parse(result.arrayOfObjects)
person Maruthi Eranki    schedule 16.01.2020
comment
Вышеупомянутый сценарий представляет собой сценарий, в котором результат, который вы получаете, находится в строковом типе данных. Итак, проверьте тип данных и, если это строка, проанализируйте его. - person Maruthi Eranki; 16.01.2020