【问题标题】:Angular 2+ filling an html table with ngFor when data is get from api当从 api 获取数据时,Angular 2+ 用 ngFor 填充 html 表
【发布时间】:2018-11-16 05:30:51
【问题描述】:

我对 Angular 还是很陌生,所以虽然我正在努力完成一些事情,但我想这并不难,我被困住了,需要你的帮助。

我需要做的是在单击按钮时以及从 api 调用接收到数据后,用客户端数据填充 html 表。

如果我将其定义为 TypeScript 类的公共属性,如 clientsData1 所示(我将其作为示例),我可以使用 ngFor 显示“固定”数据,但不能将 ngFor 绑定到包含 json 结果的变量(clientsData) 更改。

简而言之,我想要做的是,当我单击按钮时,我会启动 getItems 方法,一旦 getItems 得到结果,我就需要更新表格。

这是我的 TypeScript 类:

import {Component} from '@angular/core';
import { Injectable }     from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable }     from 'rxjs/Observable';

import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/toPromise';

@Injectable()
@Component({
  selector: 'demo-app',
  templateUrl: 'app/views/app.component.html'
})
export class AppComponent {
  public clientsData : string;
  private clientsUrl : string = 'http://www.mocky.io/v2/5808862710000087232b75ac';
  public clientsData1 : any = [{'id': 1}, {'id': 3}, {'id': 5}];
  constructor (private http: Http) { }
  ngOnInit() {
    let btnGetClients = document.getElementById("btnGetClients");
    btnGetClients.addEventListener("click", (e:Event) => this.getItems()
        .subscribe(
          ipdata => this.clientsData = ipdata.clientsJson
        ));
  }  
  getItems(): Observable<IPData> {    
        return this.http.get(this.clientsUrl)
                        .map(this.extractData);
  }
  extractData(res: Response) {
    return res.json();
  }
}
class IPData {
  public clientsJson : string;
}

这是html模板:

<h1>Insurance App</h1>
<hr />
<button id="btnGetClients">Get Clients</button>
<br/><br/>
<table>
    <thead>
        <th>Id</th>
        <th>Name</th>
        <th>Email</th>
        <th>Role</th>
    </thead>
    <tbody *ngFor="let client of clientsData">
        <tr>
            <td>{{client.id}}</td>
        </tr>
    </tbody>
</table>

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 如果您没有注意到您将数据存储在 clientsData 中并在 clientsData1 上迭代
  • 是的 Birju,我故意将其保留为我能够使用数据更新 DOM 的示例。无论如何,我会对其进行编辑,以免其他人感到困惑。

标签: angular typescript ngfor


【解决方案1】:

首先,在 TS 文件中使用任何 DOM 操作都是不好的做法。您可以像这样添加点击事件处理程序

<button (click)='getItemsSubscription()'>Get Clients</button>

并且要迭代从创建组件的那一刻起不存在的槽数组,您需要像这样使用 ngFor

 <tbody *ngFor="let client of clientsData">
        <tr>
            <td>{{client?.id}}</td>
        </tr>
 </tbody

在客户端带有引号。引号表示当您将数据放在组件词法环境中时,您将获得数据呈现,或者根本不呈现它。

如果您想通过单击按钮调用数据,还有一件事。当你调用一个函数时,你并没有订阅它,所以你需要把它包装起来并做这样的事情

  getItemsSubscription() {
       this.getItems().subscribe(
              ipdata => this.clientsData = ipdata.clientsJson
        }
  }

【讨论】:

  • 非常感谢您的快速响应 Kraken。我对代码进行了修改以符合您的建议,但是当我单击按钮时,没有任何反应。
  • 是的,我没有注意到您将public clientsData : string; 更改为任何类型
  • 感谢大家的努力。由于您的帮助,我知道我已经很接近了,但还没有运气。如果我以这种方式“手动”在 getItems() 中创建变量 clientsData: this.clientsData = [{'id': 2}, {'id': 4}, {'id': 6}];在 html 中,我可以看到 dom 用数据更新,但 api 以稍微不同的方式返回 json,所以这可能是问题所在?这是 api 网址:mocky.io/v2/5808862710000087232b75ac
  • 非常感谢 Kraken,您的新评论没问题,但我确定现在的问题在于 api 返回的 json 格式,而不是 [{},{},...]但是 {"clients": [{}, {}, ...]} 所以也许我需要提取客户端节点,或者我应该写一些稍微不同的东西而不是写 {{client?.id}}。
  • 所以 ipdata.clients 或 ipdata.clientsJson.clients,你需要一个数组,你不能;不能通过 ngFor 遍历对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2018-12-19
  • 2022-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多