【发布时间】:2017-09-04 14:09:58
【问题描述】:
我是 Angular 2 的新手,我正在尝试创建发送 get 请求并获取 json 的服务。并将这些结果从 json 绑定到角度类数组。但是当出现问题并且出现问题时。 我关注了angular.io 上的文档,并做了所有类似的事情。通过调试器我发现当我写的时候
return body.data
返回的对象是未定义的。
我得到下一个错误:
Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.
请帮我解决这个问题。
Json 数据:
[{"categoryId":1,"categoryName":"cpu"},{"categoryId":2,"categoryName":"gpu"},{"categoryId":3,"categoryName":"motherboard"},{"categoryId":4,"categoryName":"phone"},{"categoryId":5,"categoryName":"hdd"},{"categoryId":6,"categoryName":"ssd"},{"categoryId":7,"categoryName":"ram"},{"categoryId":8,"categoryName":"rom"}]
实体类:
export class Category {
constructor(public categoryId: number, public categoryName: string) {}
}
服务类:
@Injectable()
export class CategoryService {
private currentUrl = 'http://localhost:8081/emusicshop/api/categories';
constructor (private http: Http) {}
getCategories(): Observable<Category[]> {
return this.http.get(this.currentUrl)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
return body.data || { };
}
private handleError (error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
组件:
Component
export class CategoryComponent implements OnInit {
allCategories: Category[];
constructor(private service: CategoryService) { }
getCategories(): void {
this.service.getCategories().subscribe(
categories => this.allCategories = categories);
}
ngOnInit() {
this.getCategories();
}
}
HTML 文件:
<ul>
<li *ngFor="let categ of allCategories">
Id : {{categ.id}}
Name : {{categ.name}}
</li>
</ul>
【问题讨论】:
-
如果您在模板中使用
*ngFor,它需要在数组上运行。console.log(categories)在订阅里面看看它到底是什么 -
@echonax 我知道,但是在将这些 json 文件绑定到我的 allCategories 属性并且那些 allCategories 属性是一个数组时遇到了麻烦
-
在
extractData里面做一个console.log(res);,结果如何? -
body.data || { }将其转换为body.data || []并确保您的body.data必须是一个数组。 -
你能给我们看看json数据吗?我认为您无法将 json 数据与您的类别界面匹配。
标签: json angular data-binding angular2-services