在 Angular 2 中使用 *ngFor 和 JSON 对象

Posted

技术标签:

【中文标题】在 Angular 2 中使用 *ngFor 和 JSON 对象【英文标题】:Using *ngFor with a JSON object in Angular 2 【发布时间】:2016-12-29 13:40:03 【问题描述】:

我正在尝试实现一个解耦的 wordpress 解决方案,但在我的模板中显示 JSON 对象属性时有些困惑。我能够为 WP API 返回 JSON 对象,但不确定如何处理它们。我可以获得一个属性以在模板中显示它的值的唯一方法是,如果我将 [0] 添加到插值属性,这在 ngFor 循环中不起作用。我在这里阅读了@Thierry access key and value of object using *ngFor 的解决方案 但这似乎不是谷歌处理英雄之旅应用程序http://plnkr.co/edit/WkY2YE54ShYZfzJLSkMX?p=preview的方式@

Google 使用此数据集:

    
  "data": [
     "id": "1", "name": "Windstorm" ,
     "id": "2", "name": "Bombasto" ,
     "id": "3", "name": "Magneta" ,
     "id": "4", "name": "Tornado" 
  ]

对我来说它看起来像一个 JSON 对象,那么应用程序如何处理这样的事情:

 <ul>
  <li *ngFor="let hero of heroes">
    hero.name
  </li>
</ul>

我只是不清楚 RC5 中是否有允许迭代对象的更改,或者我是否仍需要以某种方式对其进行转换。我对 Angular 很陌生,可以在这个问题上使用一些指导。谢谢!!

基于 cmets 的更新,如果我想转换像 http://localhost:8888/wp-json/wp/v2/posts 这样的 api 请求,最好的方法是什么?我的返回码看起来像:

[
  
    "id": 4,
    "date": "2016-08-09T00:09:55",
    "date_gmt": "2016-08-09T00:09:55",
    "guid": 
      "rendered": “http://localhost:8888/?p=4"
    ,
    "modified": "2016-08-09T00:11:05",
    "modified_gmt": "2016-08-09T00:11:05",
    "slug": “wp-api-test”,
    "type": "post",
    "link": "http://localhost:8888/2016/08/wp-api-test”,
    "title": 
      "rendered": "testing the wp api"
    ,
    "content": 
      "rendered": "<p>loreum ipsum</p>\n"
    ,
    "excerpt": 
      "rendered": "<p>loreum ipsum</p>\n"
    ,
    "author": 1,
    "featured_media": 0,
    "comment_status": "open",
    "ping_status": "open",
    "sticky": false,
    "format": "standard",
    "categories": [
      1
    ],
  
]

【问题讨论】:

NgFor 仍然只适用于数组。在 plunkr 代码中,英雄是一个数组 heroes: Hero[]; 你想从你的 json 中渲染什么?一切? 好吧,ID、标题和内容是肯定的。这些是 Wordpress 博客文章,所以我正在尝试构建一个文章页面和一个单独的文章页面。 【参考方案1】:

只需将hero.name 替换为hero.data.name

处理JSON对象的最佳方式是创建一个接口类来轻松访问数据

【讨论】:

【参考方案2】:

非常感谢您的回答。他们帮助我找到了解决方案。我能够通过创建一个帖子数组并使其等于 Observable 返回来解决这个问题。该组件如下所示:

posts: ;

constructor (private _wpService: WpApiService) 

ngOnInit()  this.getPosts() 

getPosts() 

    this._wpService.getPosts()
        .subscribe(
          data => 
            this.posts = data;
        );
   

模板如下:

<li *ngFor="let post of posts">
     <h3>post.title.rendered</h3>
</li>

【讨论】:

【参考方案3】:

您如何定义您的服务?

这是一个例子:

export interface IPost 
  id: number;
  date: Date;
  date_gmt: Date;
  ... // rest of your defintion


@Injectable()
export class BlogPostService 
    private http: Http;

    constructor(http: Http) 
        this.http = http;
    

    private apiUrl: string = 'api/blog/posts.json';

    getPosts(): Observable<IPost[]> 
        return (this.http.get(this.apiUrl)
            .map((response: Response) => <IPost[]>response.json())
            .do(data => console.log('All: ' + JSON.stringify(data)))
            .catch(this.handleError)) as any;
    

    private handleError(error: Response) 
        console.error(error);
        return Observable.throw(error.json().error || "Server error");
    

这一行应该将您的 json 对象转换为 IPosts 的数组 []

.map((response: Response) => <IPost[]>response.json())

希望对您有所帮助。

【讨论】:

【参考方案4】:

如果不为您编写所有代码,您所问的问题就没有简短的答案,但这里有一些提示:

您必须获取返回的 JSON 响应并在 TypeScript 中创建接口或类,因此当您执行 POST 时,Angular 2 可以获取 JSON 并使用您的类将其转换为对象。

JSON 到 TS 生成器:http://json2ts.com/

Ninja Tips 2 - 使用 TypeScript 输入 JSON - http://blog.ninja-squad.com/2016/03/15/ninja-tips-2-type-your-json-with-typescript/

TypeScript Json 映射器 - http://cloudmark.github.io/Json-Mapping/

【讨论】:

以上是关于在 Angular 2 中使用 *ngFor 和 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 - NgFor 中与 NgModel 的 2 路绑定

在 Angular 2 中打破 NgFor 循环

在 div 中使用 ngFor 时,Angular 2 模板解析错误

带有 ngFor 输入的 Angular 2 模板驱动表单

在 ngFor 中计数 - Angular 2

从 Angular 2 理解 *ngFor