繁体   English   中英

Angular2-ng对于单个对象与数组

[英]Angular2 - ngFor single object vs array

我遇到从数据库接收数据对象的情况,该对象包含文件版本的记录。 可能有5个版本(5个记录)或返回了一个版本。

我的问题是我正在使用ngFor遍历数据数组并将其打印到表中。 如果仅返回一条记录,则数据不再是对象数组,而只是一个对象。

<tbody class="ruleVersions">
 <tr *ngFor="let m of mapData.ruleVersion.x">
  <td class="small">V {{ m.RuleVersion }}.0</td>
  <td [innerHtml]="m.CreatorNTID | ntidLink"></td>
  <td class="small">{{ m.VersionNotes ? m.VersionNotes : 'N/A' }}</td>
  <td class="small">{{ m.BasedOnRuleVersionID ? m.BasedOnRuleVersionID : 'N/A' }}</td>
  <td class="small">{{ m.MetaInsertUtc }}</td>
 </tr>
</tbody>

多个记录:

在此处输入图片说明

单条记录:

在此处输入图片说明

这带来了一个问题,因为ngFor被设置为循环遍历数组。 由于单个记录不是像多个对象那样的对象数组,因此会引发以下错误:

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

解决此问题的最佳方法是什么? 我可以使用角度的任何内容来将数据视为数组,即使不是,也可以使用某种管道将其视为数组吗?

我唯一想到的另一种方法是将整个对象传递给一个函数,如果它是单个记录,则将其将对象推入数组。 这就带来了一个问题,就是不希望每个记录都是一个数组。

只是好奇是否有任何内置的角度方法可以解决此问题?

更新:

我通过创建管道解决了这个问题。

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'isArray' })
export class IsArrayPipe implements PipeTransform {
    transform(x): any {
        return Array.isArray(x) ? x : [x];
    }
}

<tr *ngFor="let m of mapData.ruleVersion.x | isArray: x">

得到响应后,可以检查它是否为数组。 如果不是对象,则可以将对象设置为数组,因此在服务中应执行以下操作:

getData() {
  return this.http.get('url')
    .map(response => {
      let res = response.json();   
      if(!Array.isArray(res)) {
         return [res]    
      }  
      return res;
    })
}

所以现在,无论您获得数组还是对象,它都可以通过*ngFor迭代,因为组件始终会接收到数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM