【问题标题】:Read the json with sub array values and display on the html using ngFor读取带有子数组值的 json 并使用 ngFor 在 html 上显示
【发布时间】:2022-01-04 20:20:30
【问题描述】:

您好,我正在开发一个网络应用程序,我在其中显示以 json 格式接收的学生数据。

这是打字稿代码sn-p

    export interface studentData{
      ID : number;
      Name :string;
      Class : string;
      Languages: string;
    }
    
    const STUDENT_DATA: studentData[] = 
    [
     {
      ID : 1
      Name: "Amy",
      Class: "Grade1",
      Languages: "Java, .net, Python"
     },
     {
      ID : 2
      Name: "John",
      Class: "Grade2",
      Languages: "Kotlin, Java, Typescript"
     },
     {
      ID: 3
      Name: "Shawn",
      Class: "Grade3",
      Languages: "Javascript, C++, Perl"
     },
    ]
export class StudentDataComponent{
       languages : string[] = [];
    for (let i=0; i <= STUDENT_DATA.length - 1 ; i++)
     {
       this.languages = STUDENT_DATA[i].Languages.split(",");
     }
}

我尝试将 Languages 设为单独的数组,并考虑在使用 ngFor 在屏幕上显示时使用它

languages : string[] = [];
for (let i=0; i <= STUDENT_DATA.length - 1 ; i++)
 {
   this.languages = STUDENT_DATA[i].Languages.split(",");
 }

我尝试在 mat-chip-list 中显示如下所示,但它只显示所有 ID 的 ID 3 语言

<mat-chip-list>
   <mat-chip *ngFor = "let lang of languages>
         {{lang}}
   </mat-chip>
</mat-chip-list>

需要帮助来读取语言 json 值并在屏幕上显示。

【问题讨论】:

  • 您的实际代码是否错过了 ngFor 中的结尾引号?此外,看起来this.languages 最终会成为最后一个学生的语言。
  • 为什么要遍历学生数据并为每个数据重新创建范围变量this.languages?您的意思是为每个学生创建一个单独的数组吗?

标签: javascript angular typescript mat-table mat-chip


【解决方案1】:

如果您只是想遍历循环中每个学生的语言字符串,您可以将 split() 与第二个 ngFor 内联,如

<div *ngFor="let student of STUDENT_DATA">
 <!-- .... -->
  <mat-chip-list>
     <mat-chip *ngFor="let lang of student.languages.split(',')">
         {{lang}}
     </mat-chip>
  </mat-chip-list>
</div>

【讨论】:

    【解决方案2】:

    “它只显示所有 ID 的 ID 3 语言”

    这是因为您将this.language 设置为第一个,然后是第二个......最后它只是最后一个项目。您没有为每个学生单独设置一个。

    我认为更好的选择是在每个学生对象上添加一个属性。比如:

    this.students = STUDENT_DATA.map(s => {
        ...s,
        LanguageArray: s.Language.split(",").map(l => l.trim())
    });
    

    那么这只是学生数据的一部分,我假设您在mat-chip 之外循环。所以您可以在*ngFor="let student of students" 内部执行*ngFor="let lang of student.LanguageArray 之类的操作

    【讨论】:

      【解决方案3】:

      您的代码当前在每次迭代期间都会覆盖语言变量。修改语言类型并将索引也添加到语言变量:

      let languages: string[][] = [];
      
      for (let i = 0; i <= STUDENT_DATA.length - 1; i++) {
          languages[i] = STUDENT_DATA[i].Languages.split(",");
      }
      

      代码应该是这样的:

      <student-element *ngFor="let student of STUDENT_DATA; index as i">
      // Element code here
      <mat-chip-list>
        <mat-chip *ngFor = "let lang of languages[i]">
          {{lang}}
        </mat-chip>
      </mat-chip-list>
      </student-element>
      

      【讨论】:

      • 感谢您的回复。 StudentData 类型的 STUDENT_DATA 数组被声明为 SutdentDataComponent,因此当我在 HTML 中使用 STUDENT_DATA 时,我得到“组件 StudentDataComponent 的模板上发生错误”
      • 尝试在StudentDataComponent中声明或初始化STUDENT_DATA变量。
      • 它为每个学生输出所有科目的数据。我在这里想念的任何东西。感谢您的帮助
      • 我们应该真正看到代码以便提供进一步的指导。您想在 Stackblitz 上发布您的代码吗?
      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 2021-04-11
      • 2018-10-10
      • 1970-01-01
      • 2019-03-24
      • 2019-02-19
      • 2017-06-04
      • 2015-10-04
      相关资源
      最近更新 更多