【问题标题】:Fill table in Async way以异步方式填写表格
【发布时间】:2020-05-13 17:17:33
【问题描述】:

我有一张包含大量数据的表格。我会通过异步请求逐行从服务器获取这些数据。在每次回复时,我都会在表格中填满新行。通过这种方式,用户应该能够一步一步地看到表格填充,而不是一次。请求是按名称和日期的。所以,这是我到目前为止所做的一个例子:

dataObj$: Observable<{}>;

this.allDates.forEach(date => {
            let timeStamp = moment(date).valueOf();
            this.dataObj$ = this.service.getData(userName, timeStamp);
        });

这是结果:

{"date":1593900000000,"done":12,"progress":30}

这是桌子

<table>
  <tr>
    <th>

    </th>
    <th scope="col">
      Done
    </th>
    <th>
      Progress
    </th>
  </tr>
  <tr>
    <th scope="row">{{(dataObj$ | async)?.date | date: 'dd/MM/yyyy'}}</th>
    <td>{{(dataObj$ | async)?.done}}</td>
    <td>{{(dataObj$ | async)?.progress}}</td>
  </tr>
</table>

通过这种方式,我有一个表格,第一列中包含所有日期,完成和进度标签作为标题,其他数据填充表格的其余部分。类似的东西

      Done  Progress
data1  1       1    
data2  2       2    
data3  3       3

但实际上它不是这样工作的。现在表格只显示最后一行。我想要的不一样。它应该告诉我,一旦请求完成,它就会逐行创建。这里有什么问题?

【问题讨论】:

  • 你不应该使用循环来渲染表格吗? ngFor 具体
  • @Kenny 在这种情况下我可以循环什么?我的意思是,响应是单个对象而不是数组。你知道我怎样才能得到我想要的结果吗?当然也可以使用 ngFor
  • @End.Game 您希望请求并行还是顺序触发?
  • 可能是顺序的。并行可能是一个问题,因为有很多触发请求。我认为这是最好的方法。但如果你有建议,我很高兴听到你的声音
  • @End.Game 最好的方法是获取所有数据:) 或日期范围并使用分页。但我可以给你一个连续行的答案

标签: angular typescript asynchronous html-table


【解决方案1】:

您可以使用concat 运算符和scan 运算符来组合所有结果:

interface DataObject {
  date: number;
  progress: number;
  dont: number;
}

readonly data$: Observable<DataObject[]> = concat(
  ...this.allDates.map((date) => this.service.getData(userName, moment(date).valueOf()))
).pipe(
  scan((dates, date) => {
    dates.push(date);

    return dates;
  }, [])
)

trackByDate(i: number, data: DataObject): number {
  return data.date;
}

你可以在你的表中使用:

<table>
  <tr>
    <th></th>
    <th scope="col">Done</th>
    <th>Progress</th>
  </tr>
  <tr *ngFor="let data of data$ | async; trackBy: trackByDate">
    <td>{{ data.date | date: 'dd/MM/yyyy' }}</td>
    <td>{{ data.done }}</td>
    <td>{{ data.progress }}</td>
  </tr>
</table>

Working example 带有模拟请求

【讨论】:

  • 我要试试。谢谢!
  • 我可以看到所有请求,所以我认为它在部分工作。似乎所有日期都未定义。我放了一个调试器来查看 this.allDates 并且它的所有日期都正确。但似乎地图操作员内部出了点问题..
  • 如果我将调试器放在扫描运算符中,它不会停止。它不进去
  • 嗯,它现在可以工作了,但是它在每个日期调用了 18 次服务而不是 1 :D
  • @End.Game 我已经用一个工作示例更新了我的答案。我猜你实现错了:)
猜你喜欢
  • 2020-07-04
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2015-11-18
  • 2013-07-08
相关资源
最近更新 更多