Angular: 找不到不同的支持对象“[object Object]”
Angular: Cannot find a differ supporting object '[object Object]'
我正在关注 this tutorial。在从 api.github 获取用户列表的过程中,我收到错误:
Cannot find a differ supporting object '[object Object]'
我认为它与
有关
<ul>
<li *ngFor = "#user of users">
{{user | json}}
</li>
</ul>
在我的代码中,因为之前没有任何错误,我不确定数据是否来自 get 请求,只是点击没有给出任何错误,这是我目前的代码
@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])
我认为您在响应负载中收到的对象不是数组。也许您要迭代的数组包含在一个属性中。您应该检查接收到的数据的结构...
您可以尝试类似的方法:
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)
);
}
编辑
根据 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)
);
}
我在代码中收到此错误,因为我不会 运行 JSON.parse(结果)。
所以我的结果是一个字符串而不是对象数组。
即我得到了:
"[{},{}]"
而不是:
[{},{}]
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[];
}
);
输入 属性 周围缺少方括号可能会导致此错误。
例如:
Component Foo {
@Input()
bars: BarType[];
}
正确:
<app-foo [bars]="smth"></app-foo>
不正确(触发错误):
<app-foo bars="smth"></app-foo>
让我不止一次感到困惑的是页面上有另一个同名变量。
例如在下面的示例中,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>
解释:
您可以在数组上使用 *ngFor。您将用户声明为数组。但是,从 Get returns 你得到一个对象的响应。你不能在对象上使用 ngFor。你应该有一个数组。您可以显式地将对象转换为数组,这将解决问题。
数据到[数据]
解决方案
getusers() {
this.http.get(`https://api.github.com/
search/users?q=${this.input1.value}`)
.map(response => response.json())
.subscribe(
data => this.users = [data], //Cast your object to array. that will do it.
error => console.log(error)
)
这个荒谬的错误消息仅仅意味着绑定到一个不存在的数组。
<option
*ngFor="let option of setting.options"
[value]="option"
>{{ option }}
</option>
在上面的示例中,setting.options 的值未定义。要修复,请按 F12 并打开开发人员 window。当 get 请求 returns 时,数据会查找包含数据的值。
如果数据存在,请确保绑定名称正确
//was the property name correct?
setting.properNamedOptions
如果数据存在,是数组吗?
如果数据不存在,则在后端修复它。
如果这是 HTML 中的 return 可观察对象,只需添加异步管道
observable | async
如果您没有数组,但您试图像数组一样使用您的可观察对象,即使它是一个对象流,这将无法在本机工作。我在下面展示了如何解决这个问题。
如果您尝试使用源类型为 BehaviorSubject 的可观察对象,请将其更改为 ReplaySubject,然后在您的组件中像这样订阅它:
组件
this.messages$ = this.chatService.messages$.pipe(scan((acc, val) => [...acc, val], []));
Html
<div class="message-list" *ngFor="let item of messages$ | async">
我正在关注 this tutorial。在从 api.github 获取用户列表的过程中,我收到错误:
Cannot find a differ supporting object '[object Object]'
我认为它与
有关 <ul>
<li *ngFor = "#user of users">
{{user | json}}
</li>
</ul>
在我的代码中,因为之前没有任何错误,我不确定数据是否来自 get 请求,只是点击没有给出任何错误,这是我目前的代码
@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])
我认为您在响应负载中收到的对象不是数组。也许您要迭代的数组包含在一个属性中。您应该检查接收到的数据的结构...
您可以尝试类似的方法:
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)
);
}
编辑
根据 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)
);
}
我在代码中收到此错误,因为我不会 运行 JSON.parse(结果)。
所以我的结果是一个字符串而不是对象数组。
即我得到了:
"[{},{}]"
而不是:
[{},{}]
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[];
}
);
输入 属性 周围缺少方括号可能会导致此错误。 例如:
Component Foo {
@Input()
bars: BarType[];
}
正确:
<app-foo [bars]="smth"></app-foo>
不正确(触发错误):
<app-foo bars="smth"></app-foo>
让我不止一次感到困惑的是页面上有另一个同名变量。
例如在下面的示例中,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>
解释: 您可以在数组上使用 *ngFor。您将用户声明为数组。但是,从 Get returns 你得到一个对象的响应。你不能在对象上使用 ngFor。你应该有一个数组。您可以显式地将对象转换为数组,这将解决问题。 数据到[数据]
解决方案
getusers() {
this.http.get(`https://api.github.com/
search/users?q=${this.input1.value}`)
.map(response => response.json())
.subscribe(
data => this.users = [data], //Cast your object to array. that will do it.
error => console.log(error)
)
这个荒谬的错误消息仅仅意味着绑定到一个不存在的数组。
<option
*ngFor="let option of setting.options"
[value]="option"
>{{ option }}
</option>
在上面的示例中,setting.options 的值未定义。要修复,请按 F12 并打开开发人员 window。当 get 请求 returns 时,数据会查找包含数据的值。
如果数据存在,请确保绑定名称正确
//was the property name correct?
setting.properNamedOptions
如果数据存在,是数组吗?
如果数据不存在,则在后端修复它。
如果这是 HTML 中的 return 可观察对象,只需添加异步管道
observable | async
如果您没有数组,但您试图像数组一样使用您的可观察对象,即使它是一个对象流,这将无法在本机工作。我在下面展示了如何解决这个问题。
如果您尝试使用源类型为 BehaviorSubject 的可观察对象,请将其更改为 ReplaySubject,然后在您的组件中像这样订阅它:
组件
this.messages$ = this.chatService.messages$.pipe(scan((acc, val) => [...acc, val], []));
Html
<div class="message-list" *ngFor="let item of messages$ | async">