Angular 在 html 表中显示 json 对象

Posted

技术标签:

【中文标题】Angular 在 html 表中显示 json 对象【英文标题】:Angular showing json object in html table 【发布时间】:2020-06-04 22:25:45 【问题描述】:

大家好,我有来自 firestore 的 json 数据,我想在 html 表中显示这些数据。

这是我的 customer-list.component.html

<body>
  <div class="container">
    <div class="title">
      <h3>Customer Table</h3>
    </div>
    <div class="row">
      <div class="col-md-12">
      </div>
      <div class="col-lg-8 col-md-10 ml-auto mr-auto">
        <div class="table-responsive">
          <table class="table">
            <thead>
              <tr>
                <th class="text-center">#</th>
                <th>Name</th>
                <th>Age</th>
                <th>Active</th>
              </tr>
            </thead>
            <tbody>
              <div *ngFor="let customer of customers" style="width: 300px;">
                <app-customer-details [customer]='customer'></app-customer-details>
              </div>
        <div style="margin-top:20px;">
          <button type="button" class="button btn-danger" (click)='deleteCustomers()'>Delete All</button>
        </div>
        </tbody>
        </table>
      </div>
      </div>

好像没什么问题。

这是我的 customer-details.component.html

<div *ngIf="customer">
<tr>
   <td>
       <label>First Name: </label> customer.name
     </td>
     <td>
       <label>Age: </label> customer.age
     </td>
     <td>
       <label>Active: </label> customer.active
     </td>
     <span class="button is-small btn-primary" *ngIf='customer.active' (click)='updateActive(false)'>Inactive</span>

     <span class="button is-small btn-primary" *ngIf='!customer.active' (click)='updateActive(true)'>Active</span>

     <span class="button is-small btn-danger" (click)='deleteCustomer()'>Delete</span>
</tr>
</div>

但我的表格输出是:

感谢您的回答。

【问题讨论】:

在您的详细信息组件中添加&lt;pre&gt;customer | json&lt;/pre&gt; 以检查您是否正在获取数据? 正确获取数据但未正确显示数据名字:john 应位于表的名称列下。 【参考方案1】:

不要将客户组件的宽度限制为 300 像素,就像您在此处所做的那样:

<div *ngFor="let customer of customers" style="width: 300px;">

【讨论】:

还是一样,我尝试了不同的方法,例如在客户详细信息中初始化表格,但仍然相同的数据不分隔表格的列【参考方案2】:

您有很多东西无法正确呈现您的表格:

<tbody>
  <div *ngFor="let customer of customers" style="width: 300px;">
      <app-customer-details [customer]='customer'>
      </app-customer-details>
   </div>
   ....
</tbody>

这将呈现如下:

<tbody>
  <div ...>
      <app-customer-details>
       <div> <tr>.....</tr></div>
      </app-customer-details>
   </div>
   ....
</tbody>

这不是正确的 HTML。

将您的详细组件更改为使用ng-template

<ng-template >
  <tr *ngIf="customer">
    <td><label>First Name: </label> customer.name</td>
    <td><label>Age: </label> customer.age</td>
    <td><label>Active: </label> customer.active</td>
    <td> 
      Note: All spans should also be inside a TD tag
    </td>

  </tr>
</ng-template> 

【讨论】:

当我使用 ng-template 表为空但数据通过时仍然相同,我尝试了 ng-container 但它给出的结果与图片相同【参考方案3】:

当你查看 DOM 树时,你会发现

&lt;tr&gt;&lt;app-customer-details&gt;...&lt;/app-customer-details&lt;/td&gt;

这不会导致组件在表格中呈现为 a,而是会将整个组件 HTML 模板塞入一列中。

通过向组件添加属性选择器,即选择器:'app-customer-details,[app-customer-details]',您可以像这样直接将选择器添加到元素,现在组件HTML模板中的元素将在表格内正确呈现。

看看这个link;

正确的代码如下: 客户列表.component.html

<div class="container">
    <div class="title">
        <h3>Customer Table</h3>
    </div>
    <div class="row">
        <div class="col-md-12">
        </div>
        <div class="col-lg-8 col-md-10 ml-auto mr-auto">
            <div class="table-responsive">
                <table class="table">
                    <thead>
                        <tr>
                            <!-- <th class="text-center">#</th> -->
                            <th>Name</th>
                            <th>Age</th>
                            <th>Active</th>
                        </tr>
                    </thead>
                    <tbody>
              <tr *ngFor="let customer of customers" [customerDetails]="customer">
              </tr>
                        <div style="margin-top:20px;">
                            <button type="button" class="button btn-danger" (click)='deleteCustomers()'>Delete All</button>
                        </div>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

客户详细信息.component.html

<td>
  customerDetails.name
</td>
<td>
  customerDetails.age
</td>
<td>
  customerDetails.active
</td>

Customer-details.component.ts

import  Component, OnInit, Input  from '@angular/core';

@Component(
  selector: 'customerDetails, [customerDetails]',
  templateUrl: './customer-details.component.html',
  styleUrls: ['./customer-details.component.css']
)
export class CustomerDetailsComponent implements OnInit 

  @Input() customerDetails: object = ;
  constructor()  

  ngOnInit() 
  


【讨论】:

这就是我要找的东西,谢谢你刚刚将 [customerDetails] 选择器添加到我的组件中。

以上是关于Angular 在 html 表中显示 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 KeyValue 管道中过滤特定值以显示在 html 表中的特定标题下 |角 6 +

(IONIC - Angular)我如何在 html 卡片中仅显示符合特定条件的 JSON 中的某些对象?

Angular 2 ngClass:在尝试在 html 上显示 json 时获取预期表达式的插值 ()

Angular > 在材质表中显示列和行

Angular 2:如何在不向用户显示标签的情况下从 JSON 响应呈现 HTML? [复制]

如何使用 jquery 在 HTML 表中显示 json 内容