网站搜索

javascript - 在 angular 10 mat-table 中显示来自两个数据源的数据


当前配置是 Angular 10,使用 C# ASP.NET Core 3.1 Web API

所以,我正在尝试使用以下两个表中的数据

Student Records                    Homework Records
id  |  Name    |  HW ID            id  |  HW_Name
=======================            ==========================
1   |  Bob     |  7        AND     7   |  Addition_practice_1
2   |  Bob     |  10               10  |  Addition_practice_2

目标:在一个 Angular 表格中,我想显示学生记录中的所有列,但不包括作业 ID。在该位置,我想获取与作业 ID 相关的作业名称。例如,我希望输出的 Angular 表格如下所示:

Student   |   HW Name
==================================
Bob       |   Addition_practice_1
Bob       |   Addition_practice_2

我的 .ts:

  ngOnInit(): void {
    this.studentRecordService.getStudentRecordsByName(this.studentName).subscribe((data: any[]) => {
      this.dataSource.data = data;
      this.dataSource.sort = this.sort;
    });

我已经成功地拉取了所有学生记录并将它们放在表格中。

然而,我一直在努力找到一种好的方法来获取 HW_Name 并将其也放入表格中。我已经为作业记录定义了所有的 CRUD 操作。我希望我可以仅使用 HW_id 来调用作业记录的服务,但我不确定该如何操作。

我能够让这个打印出正确的数值

var hw_name;
var student_obs = this.studentService.getStudentByStudentId("fbf81537-b656-40d7-640f-08d8358ce483")
var hw_obs = student_obs.pipe(mergeMap((student: Student) => this.hwRecordService.gethwRecordDetailsById(student.hw_id)));

hw_obs.subscribe((v : Hw_Record) => {
      hw_name = v.name; 
      console.log(bot_name);
    });

这使我能够获取正确关联的 hwRecord 可观察对象。我觉得使用 mergeMap 和可能的 forkJoin 是正确的方向,但我找不到一个以类似方式实现的好例子。我尝试在整个可观察数组的范围内做同样的事情,但问题不断出现。


我主要的问题是我有几件事情不清楚:

  1. dataSource 需要以什么格式才能工作?
  2. 这能像我从 pipe/mergeMap 方法想的那样简单地完成吗?


抱歉信息量有点大。如果有人能提供帮助,将不胜感激。

答案#1

如果你能更改你的后端,最好的方法是通过 SQL 直接在你的数据库中查询它

SELECT Students.Name, Homeworks.Name
FROM Students
INNER JOIN Homeworks ON Students.HW_ID=Homeworks.ID;

如果你必须在前端进行操作,你可以这样做

   forkJoin([this.getAllStudents(), this.getAllHomeworks()]).subscribe(
     ([students, homework]) => {
       this.result = students.map((student) => ({
         name: student.name,
         homework: homework.find((h) => h.id === student.homework_id).name,
       }));
     }
   );

但请注意,你将获取所有作业记录,即使那些没有关联学生的作业记录也会被获取

这样你会先获取所有学生,然后对每个学生获取他们的作业

  this.getAllStudents()
  .pipe(
    switchMap((students) =>
      forkJoin(
        students.map((s) =>
          getHomeworkById(s.homework_id).pipe(
            map((homework) => ({
              name: s.name,
              homework: homework.name,
            }))
          )
        )
      )
    )
  )
  .subscribe((result) => (this.result = result));