Angular: не удается найти отличающийся поддерживающий объект '[object Object]'
Следующее этот учебник. На пути к получению списка пользователей из api.github Im получаем ошибку:
Не удается найти отличающийся поддерживающий объект "объект объекта"
Я думаю, что это связано с
<ul>
<li *ngFor = "#user of users">
{{user | json}}
</li>
</ul>
В моем коде, потому что перед ним не было никакой ошибки, и я не уверен, что данные поступают из запроса на получение, просто нажав, не дал никакой ошибки, вот мой код до сих пор
@Component({
selector: 'router',
pipes : [],
template: `
<div>
<form [ngFormModel] = "searchform">
<input type = 'text' [ngFormControl]= 'input1'/>
</form>
<button (click) = "getusers()">Submit</button>
</div>
<div>
<ul>
<li *ngFor = "#user of users">
{{user | json}}
</li>
</ul>
</div>
<router-outlet></router-outlet>
`,
directives: [FORM_DIRECTIVES]
})
export class router {
searchform: ControlGroup;
users: Array<Object>[];
input1: AbstractControl;
constructor(public http: Http, fb: FormBuilder) {
this.searchform = fb.group({
'input1': ['']
})
this.input1 = this.searchform.controls['input1']
}
getusers() {
this.http.get(`https://api.github.com/
search/users?q=${this.input1.value}`)
.map(response => response.json())
.subscribe(
data => this.users = data,
error => console.log(error)
)
}
}
bootstrap(router, [HTTP_PROVIDERS])
Ответы
Ответ 1
Я думаю, что объект, который вы получили в своей полезной нагрузке, не является массивом. Возможно, массив, который вы хотите повторить, содержится в атрибуте. Вы должны проверить структуру полученных данных...
Вы можете попробовать что-то вроде этого:
getusers() {
this.http.get(`https://api.github.com/search/users?q=${this.input1.value}`)
.map(response => response.json().items) // <------
.subscribe(
data => this.users = data,
error => console.log(error)
);
}
Edit
Следуя документу Github (developer.github.com/v3/search/#search-users), формат ответа:
{
"total_count": 12,
"incomplete_results": false,
"items": [
{
"login": "mojombo",
"id": 1,
(...)
"type": "User",
"score": 105.47857
}
]
}
Таким образом, список пользователей содержится в поле items
, и вы должны использовать это:
getusers() {
this.http.get(`https://api.github.com/search/users?q=${this.input1.value}`)
.map(response => response.json().items) // <------
.subscribe(
data => this.users = data,
error => console.log(error)
);
}
Ответ 2
Я получил эту ошибку в своем коде, потому что я не запускал JSON.parse(result).
Итак, мой результат был строкой вместо массива объектов.
то есть. Я получил:
"[{},{}]"
вместо:
[{},{}]
import { Storage } from '@ionic/storage';
...
private static readonly SERVER = 'server';
...
getStorage(): Promise {
return this.storage.get(LoginService.SERVER);
}
...
this.getStorage()
.then((value) => {
let servers: Server[] = JSON.parse(value) as Server[];
}
);
Ответ 3
Отсутствие квадратных скобок вокруг свойства input может вызвать эту ошибку. Например:
Component Foo {
@Input()
bars: BarType[];
}
Правильный:
<app-foo [bars]="smth"></app-foo>
Неверно (ошибка запуска):
<app-foo bars="smth"></app-foo>
Ответ 4
Что-то, что поймало меня несколько раз, - наличие на странице другой переменной с тем же именем.
Например, в приведенном ниже примере данные для NgFor
находятся в requests
переменных. Но есть также переменная #requests
используемая для if-else
<ng-template #requests>
<div class="pending-requests">
<div class="request-list" *ngFor="let request of requests">
<span>{{ request.clientName }}</span>
</div>
</div>
</ng-template>