Angular2 ngFor:我做错了什么?

时间:2016-10-07 18:22:55

标签: angular ngfor

我难以克服“无法找到'对象'类型的'对象对象''的错误”这个错误似乎与Angular2非常相似,我希望有人遇到类似的东西。

这是来自我服务的(匿名)JSON,非常简单:

[
    {
        "item_id": 1,
        "item_type": 2,
        "item_name": "Item 1",
        "item_description": "First item"
    },
    {
        "item_id": 2,
        "item_type": 4,
        "item_name": "Item 2",
        "item_description": "Second item"
    }
]

这是描述这些对象的类,服务和组件的内容:

// item.ts
export class Item {
    item_id: number;
    item_type: number;
    item_name: string;
    item_description: string;
}

//item.service.ts snippet
getItems(): Promise<Item[]> {
    return this.http.get('http://apiurl', { withCredentials: true })
    .toPromise()
    .then((response) => {
        let body = response.json();
        return body as Item[];
    })
    .catch(this.handleError);
}

//item.component.ts snippet
items: Item[];

getItems(): void { // Function that calls the item service
    this.itemService
    .getItems()
    .then((items) => {
        console.log(items); // I use this to verify that I'm getting an array.
        this.items = items;
    });
}

最后,ngFor组件:

<ul>
    <li *ngFor="let item of items">
        <i class="fa fa-database"></i> {{item.item_name}}
    </li>
</ul>

我没有看到任何部分的任何错误。检索到的数据肯定会到达项目组件,这意味着我的导入是正确的,并且我的console.log中显示的内容绝对是一个数组,具有__proto__:Array[0]属性和所有内容。如果我登录Angular教程Heroes app,它甚至看起来与输出相同。然而,它根本不会迭代数组,坚持认为它是一个对象。

我做错了什么?刚刚破坏了吗?

修改 这是完整的(匿名的)类,删除了不相关的位:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Headers, Response, Http, RequestOptions } from '@angular/http';
import { Item } from '../../classes/item/item';
import { ItemService } from '../../services/item/item.service';

@Component({
    moduleId: module.id,
    selector: 'my-items',
    templateUrl: 'items.component.html'
})
export class ItemComponent implements OnInit {
    items: Item[] = [];

    constructor(
    private router: Router,
    private itemService: ItemService
    ) { }

    getItems(): void {
        console.log(this.items);
        this.itemService
        .getItems()
        .then((items) => {
            console.log(items);
            this.items = Array.from(items);
        });
    }

    ngOnInit() {
        this.getItems();
    }
}

编辑2

我明白了!我认为它可能是Angular2中的一个错误。上面,我使用名为“items”的通用变量名来清理我的代码。但在真实的生产代码中,变量被称为“实体”。在整个过程中,我都有这样的名字。一时兴起,我将变量的名称更改为“testentities”,并且它有效!

所以,为了确保,我测试了多种变体,并且每次都有效。然后我将其改回“实体”,错误再次出现。它似乎是某种保留变量。

我会严格测试一下,如果它一致可重复,我会在错误跟踪器上报告。

1 个答案:

答案 0 :(得分:1)

试一试

item.service.ts 代码段

getItems(): Promise<Item[]> {
    return this.http.get('http://apiurl', { withCredentials: true })
    .toPromise()
    .then((response) => {
        let body = response.json();
        return body;
    })
    .catch(this.handleError);
}

item.component.ts 代码段

items: Item[] = []; // For whatever reason it thinks this is an Object

getItems(): void { // Function that calls the item service
    //this.items = Array.from(this.items);
    this.itemService.getItems().then(items => this.items = items);
}

[UPDATE]

下,你已经耗尽了我的调试资源,所以我将把它带到基础,

Angular 2 HTTP Client是他们向您展示如何发出GET请求的地方。然后HERE是基于Promise的设置。

因此,这就是你的看法。

item.service.ts 代码段

getItems(): Promise<Item[]> {
    return this.http.get('http://apiurl', { withCredentials: true })
    .toPromise()
    .then(this.extractData)
    .catch(this.handleError);
}
private extractData(res: Response) {
  let body = res.json();
  return body || { };
}
private handleError (error: any) {
  // In a real world app, we might use a remote logging infrastructure
  // We'd also dig deeper into the error to get a better message
  let errMsg = (error.message) ? error.message :
    error.status ? `${error.status} - ${error.statusText}` : 'Server error';
  console.error(errMsg); // log to console instead
  return Promise.reject(errMsg);
}

<强> item.component.ts

items: Item[] = [];

getItems(): void {
  this.itemService.getItems().then(items => this.items = items);
}


更新#2

听起来OP发现了他的问题并且它与其中一个变量的名称有关,看起来名为entites的变量可能会导致Angular 2中断。

  

“但是在实际的生产代码中,变量被称为”实体“。而且在整个过程中,我都有这样的命名。一时兴起,我将变量的名称改为”testentities, “它有效!

     

所以,为了确保,我测试了多种变体,并且每次都有效。然后我把它改回“实体”,错误再次出现。“

entities: any{};