如何使用ngfor显示子对象的信息

How to display the information of a subobject using ngfor

我正在使用 angular 开发应用程序,我需要显示一些具有以下结构的数据:

{
    "id": 33,
    "arg": 7,
    "date": "2022-01-31",
    "User": {
        "Name": "Cristian",
        "Group": {
            "NGroup": "Group 1"
        }
    },
    "Sport": {
        "NSport": "Sport 1"
    }
},

应该这样显示信息

编号 |参数 |日期 |姓名(用户) | NGroup(集团)| NSport(运动)

为此我尝试使用键值,问题是当它带来用户对象时,它向我显示了一个名为 [object Object] 的“项目”,它对应于组并且无法隐藏它。这是当前代码:

                 <tbody>
                    <tr *ngFor="let item of listItems">
                      <td><div>{{ item.id }}</div></td>                               
                      <td><div>{{ item.arg}}</div></td>
                      <td><div>{{ item.date }}</div></td>
                      <td *ngFor="let key of item.User | keyvalue "><div>{{ key.value }}</div></td>
                      <td *ngFor="let key of item.User | keyvalue"><div *ngFor="let key2 of key.value | keyvalue" >{{ key2.value }}</div></td>                         
                      <td *ngFor="let kv of item.Sports | keyvalue"><div>{{kv.value}}</div></td>                         
                   
                    </tr>  
                  </tbody>

这个输出是:

编号 |参数 |日期 | [对象,对象] |姓名(用户) | NGroup(集团)| NSport(运动)

问题是:我怎样才能只显示对象的某些项目而不是所有内容

谢谢!!

这可能是在回避问题,但通常我会尽量使组件模板文件保持简单。它有助于将业务逻辑包含在您的 TS 文件中,这还可以实现更好的测试场景。

既然您知道所需的输出 id | arg | date | Name (User) | NGroup (Group) | NSport (Sport),您应该使用组件的 TS 文件为视图创建该界面。一个简单的 .map() 就可以完成这项工作。

this.viewItems = this.listItems.map(item=>{
  const { id, arg, date, User, Sport } = item;
  const name = User.Name;
  const nGroup = User.Group.NGroup;
  const nSport = Sport.NSport;
  return { id, arg, date, name, nGroup, nSport };
});

现在您只需要一个 *ngFor 循环来渲染您的数据。

<tbody>
  <tr *ngFor="let item of viewItems">
    <td><div>{{ item.id }}</div></td>
    <td><div>{{ item.arg}}</div></td>
    <td><div>{{ item.date }}</div></td>
    <td><div>{{ key.name }}</div></td>
    <td><div>{{ key.nGroup }}</div></td>
    <td><div>{{ key.nSport }}</div></td>
  </tr>
</tbody>

注意:虽然它已在您的源数据中定义,但我会避免使用大写字母(UserSport)命名对象。这种命名风格应该保留用于定义 类.

您可以使用如下方式筛选出要显示的项目:

<table>
 <tr *ngFor="let item of listItems">
 <td><div>{{ item.id }}</div></td>                               
 <td><div>{{ item.arg}}</div></td>
 <td><div>{{ item.date }}</div></td>
 <ng-container *ngFor="let key of item.User | keyvalue ">
  <td *ngIf="isInteresting(key.value)">{{ key.value }}</td>
 </ng-container>

 <td *ngFor="let key of item.User | keyvalue"><div *ngFor="let key2 of 
key.value | keyvalue" >{{ key2.value }}</div></td>                         
 <td *ngFor="let kv of item.Sport | keyvalue"><div>{{kv.value}}</div></td>                         

</tr>  
</table>

在组件中:

isInteresting(val): boolean { return typeof val !== 'object'; }