【问题标题】:Can't bind objects from json to angular 2 class无法将对象从 json 绑定到 angular 2 类
【发布时间】: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


【解决方案1】:

您的响应对象没有data 字段。应该更像这样:

private extractData(res: Response) {
    let body = res.json();
    return body || []; //<-- return an empty array instead of an object so *ngFor won't complain about iteration
}

并尝试在您的模板上使用安全导航运算符?

<ul>
  <li *ngFor="let categ of allCategories">
    Id : {{categ?.categoryId}}
    Name : {{categ?.categoryName}}
  </li>
</ul>

【讨论】:

  • 谢谢它帮助了一点。但现在的问题是如何将这些 json 绑定到我的 allCategories 属性。现在它可以工作并循环通过 ngFor,但没有显示来自元素的数据。例如,我在那里有 8 个元素,我得到了输出: Id:名称:Id:名称:Id:名称:Id:名称:Id:名称:Id:名称:Id:名称:Id:名称:没有任何属性
  • 同样的结果
  • @MaksymVasylenko this.service.getCategories().subscribe( categories =&gt;{ console.log(categories); this.allCategories = categories}); 记录了什么?
  • [对象,对象,对象,对象,对象,对象,对象,对象] 0:对象 categoryId:1 categoryName:“cpu”proto:对象 1:对象 categoryId :2 categoryName:“gpu”proto:对象 2:对象 categoryId:3 categoryName:“motherboard”proto:对象等
  • Maksym,如果它解决了您的问题,请接受答案(通过单击此答案投票下的灰色勾号)。这样,问题被标记为已解决:)
猜你喜欢
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多