Невозможно найти отличающийся поддерживающий объект "объект объекта" типа "объект". 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.
Итак, что не так с этим кодом?
Ответы
Ответ 1
Там вам не нужно использовать this.requests=
при вызове get
(тогда requests
будет иметь наблюдаемую подписку). Вы получите ответ в наблюдаемом success
, поэтому значение requests
в успехе имеет смысл (который вы уже делаете).
this._http.getRequest().subscribe(res=>this.requests=res);
Ответ 2
Удалите this.requests
из
ngOnInit(){
this.requests=this._http.getRequest().subscribe(res=>this.requests=res);
}
к
ngOnInit(){
this._http.getRequest().subscribe(res=>this.requests=res);
}
this._http.getRequest()
возвращает подписку, а не значение ответа.
Значение ответа назначается обратным вызовом, переданным в subscribe(...)
Ответ 3
В вашем файле 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 файла. Пожалуйста, попробуйте код выше, я уверен, что он будет работать.
Ответ 4
Вы можете объявить книги (в строке 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);
});
}
Ответ 5
У меня была такая же ошибка, потому что я сопоставил HTTP-ответ следующим образом:
this.http.get(url).map(res => res.json);
Обратите внимание, как я случайно вызвал .json как переменную, а не как метод.
Изменение его на:
this.http.get(url).map(res => res.json());
сделал трюк.
Ответ 6
Мое решение - создать Pipe для возврата массива значений или объекта propierties
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>
Ответ 7
у меня та же проблема. Так я решил проблему. Во-первых, когда происходит ошибка, мой массив данных поступает из БД, как это -,
{brands: Array(5), _id: "5ae9455f7f7af749cb2d3740"}
убедитесь, что ваши данные являются массивом, а не объектом, который содержит массив. только массив выглядит так -
(5) [{…}, {…}, {…}, {…}, {…}]
это решило мою проблему.
Ответ 8
Я столкнулся с такой же проблемой
мой начальный json
{"items":
[
{"id":1,
"Name":"test4"
},
{"id":2,
"Name":"test1"
}
]
}
Я изменил свой json внутри []
[{"items":
[
{"id":1,
"Name":"test4"
},
{"id":2,
"Name":"test1"
}
]
}]
Ответ 9
Для перебора объекта, который имеет формат json, как показано ниже
{
"mango": { "color": "orange", "taste": "sweet" }
"lemon": { "color": "yellow", "taste": "sour" }
}
-
Присвойте это переменной
let rawData = { "mang":{...}, "lemon": {...} }
-
Создать пустой массив для хранения значений (или ключей)
let dataValues = [];//For values
let dataKeys = [];//For keys
-
Зацикливайтесь на ключах и добавляйте значения (и ключи) в переменные
for(let key in rawData) {//Pay attention to the 'in' dataValues.push(rawData[key]); dataKeys.push(key); }
-
Теперь у вас есть массив ключей и значений, которые вы можете использовать в * ngFor или в цикле for
for(let d of dataValues) { console.log("Data Values",d); }
<tr *ngFor='let data of dataValues'>..... </tr>
Ответ 10
Вы должны использовать асинхронную трубу. Док: https://angular.io/api/common/AsyncPipe
Например:
<li *ngFor="let a of authorizationTypes | async"[value]="a.id">
{{ a.name }}
</li>
Ответ 11
this.requests=res
здесь вы пытаетесь назначить следующий ответ на объект,
{"headers":{"normalizedNames":{},"lazyUpdate":null},"status":200,"statusText":"OK",
"url":"xyz","ok":true,"type":4,"body":[{}]}
Поскольку формат объекта отличается от формата ответа, вам необходимо назначить часть res.body
из своего ответа, чтобы получить необходимое содержимое.
Ответ 12
<ul>
<li *ngFor = "let Data of allDataFromAws | async">
<pre> {{ Data | json}}</pre>
</li>
</ul>
используйте async для преобразования allDataFromAws в объект Array....
Ответ 13
В вас используется пружинный ботинок с Angular; убедитесь, что вы создаете по умолчанию
Ответ 14
Просто объявите переменную как массив, в котором вы храните данные, у меня это сработало.
listingdata:Array<any> = [];
this.listingdata = data.results.rows;
и зациклить данные о листинге на HTML-странице
Ответ 15
Если вы столкнулись с этой проблемой через 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>
Я знаю, что это явная ошибка задним числом, но я надеюсь, что ответ здесь спасет кого-то от головной боли, которая у меня сейчас есть.
Ответ 16
requests = [];
this.requests[0] =this._http.getRequest().subscribe(res=>this.requests=res);
а также
*ngFor="let product of requests[0]"