【问题标题】:create view by using two different array使用两个不同的数组创建视图
【发布时间】:2020-11-13 22:33:52
【问题描述】:

我有两个数组。第一个有classId和className

classes = [  {classid : 1 , classname:"class1"},{classid : 2 , classname:"class2"},{classid  : 3 , classname:"class3"}]

第二个数组是:

 subjectWithTopics = [
  {classid:1,subjectName:"hindi", topicName : "topic1 of hindi class id 10" },
  {classid:1,subjectName:"hindi", topicName : "topic2 of hindi class id 10" },
  {classid:1,subjectName:"English", topicName : "topic1 of English class id 10" },
  {classid:1,subjectName:"English", topicName : "topic2 of English class id 10" },
  {classid:1,subjectName:"English", topicName : "topic3 of English class id 10" },
  {classid:2,subjectName:"hINDI", topicName : "topic1 of hINDI class id 20" },
  {classid:2,subjectName:"HINDI", topicName : "topic2 of hINDI class id 20" },
  {classid:2,subjectName:"HINDI", topicName : "topic3 of HINDI class id 20" },
  {classid:2,subjectName:"English", topicName : "topic1 of English class id 20" },
  {classid:2,subjectName:"English", topicName : "topic2 of English class id 20" },
  {classid:2,subjectName:"English", topicName : "topic3 of English class id 20" },
]

我想要的是在屏幕左侧我将使用 ngFor 根据类数组显示按钮。点击这些按钮中的任何一个,屏幕右侧将显示该班级的主题,点击该班级的每个主题的主题。

我在想的是我将捕获类按钮的 classid,然后根据该 id 对 subjectWithTopics 数组进行排序,但不知道接下来会发生什么。

如果有人可以请帮忙。

【问题讨论】:

  • 你完成了 Angular 的英雄之旅教程了吗?他们进入主题,例如显示数据列表、单击一个以及根据单击的内容显示“详细信息”页面。 angular.io/tutorial
  • 是的,我已经完成了,但是在另一页上显示数据..我希望它在同一页上,而且我的数组也有点复杂。
  • 你能创建stackblitz吗stackblitz.com

标签: javascript html angular typescript angular8


【解决方案1】:

为此,您可以调用一个方法来过滤(或排序,任何您喜欢的)subjectWithTopics 数组以显示它。

假设您从右侧隐藏的表格开始,单击按钮后将显示所选的 classId。

因此,我们从打印所有按钮的 ngFor 开始:

<button *ngFor="let c of classes" (click)="selectClass(c)"> 
    {{ c.classname }} 
</button>

至少在本例中,右手表格应该显示给定 classId 的所有选定元素,或者如果没有元素则隐藏。我会这样做:

<table *ngIf="selectedSubjects && selectedSubjects.length > 0" >
    <tr>       
       <th> Subject name </th>
       <th> Subject name </th>
    </tr>
    <tr *ngFor="let subject of selectedSubjects">
       <th> {{ subject.subjectName }} </th>
       <th> {{ subject.topicName }} </th>
    </tr>
</table>

在控制器(.ts 文件)中,您编写“selectClass”函数,该函数将过滤 subjectWithTopics 数组,并将其放入我们新创建的数组“selectedSubjects”(您应该在控制器的类中定义):

selectClass(selectedClass){
   this.selectedSubjects = subjectWithTopics.filter( topic => topic.classId === selectedClass.classid);
}

这应该可以解决问题!

【讨论】:

  • 谢谢,这解决了我的第一个问题。但我需要在右侧显示所选课程的主题名称,并且在该主题名称内我将显示其主题。就像第一个项目符号一样主题为英语,里面将有我的英语主题。
  • 这是一个小的修改,你肯定可以自己实现!如果答案有帮助,请考虑投票和/或将其视为有效答案:)。
【解决方案2】:

component.html

<!-- display unique subject array and on setTopics() will filter topics by subject name-->
<h3>Classes</h3>
<div *ngFor="let classname of classes" style="display:inline-block;">
  <button style="margin: 0px 5px; color: blue;" (click)="setTopics(classname)">{{classname | uppercase}}  </button>
</div>
<h3>Topics</h3>
<div *ngFor="let topic of topics">
  <div (click)="setTopics(topic)">{{topic.topicName}}  </div>
</div>

compoent.ts

import { Component, VERSION, OnInit } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  implements OnInit{
  name = 'Angular ' + VERSION.major;
  classesArray  = [
  {classid:1,subjectName:"hindi", topicName : "topic1 of hindi class id 10" },
  {classid:1,subjectName:"hindi", topicName : "topic2 of hindi class id 10" },
  {classid:1,subjectName:"English", topicName : "topic1 of English class id 10" },
  {classid:1,subjectName:"English", topicName : "topic2 of English class id 10" },
  {classid:1,subjectName:"English", topicName : "topic3 of English class id 10" },
  {classid:2,subjectName:"hINDI", topicName : "topic1 of hINDI class id 20" },
  {classid:2,subjectName:"HINDI", topicName : "topic2 of hINDI class id 20" },
  {classid:2,subjectName:"HINDI", topicName : "topic3 of HINDI class id 20" },
  {classid:2,subjectName:"English", topicName : "topic1 of English class id 20" },
  {classid:2,subjectName:"English", topicName : "topic2 of English class id 20" },
  {classid:2,subjectName:"English", topicName : "topic3 of English class id 20" },
];
classes = [];
topics = [];
ngOnInit() {
  // find unique class names
  this.classes = this.classesArray.map((obj) => obj.subjectName.toLowerCase());
    this.classes = this.classes.filter((v, i) => this.classes.indexOf(v) === i);
  // default selected subject to hindi
  this.setTopics('hindi');
}
// filter topics by subjectname and generate new topics array
setTopics(subjectName) {
  this.topics = this.classesArray.filter((classes)=> classes.subjectName.toLowerCase() === subjectName.toLowerCase())
}

}

这是工作演示https://stackblitz.com/edit/santosh-angular-array-filter

【讨论】:

    【解决方案3】:

    您可以将主题存储在变量中并在 html 中呈现该变量。

    您可以编写一个函数来在单击某个类时获取主题。 例如

    let subjects = [];
    ...
    getSubjects(classId){
      this.subjects = this.subjectWithTopics.filter(subject=>subject.classId===classId)
    }
    

    然后在html中的for循环中渲染这个函数。 例如

    <div ngFor="let subject of subjects">
    </div>
    

    【讨论】:

    • 我需要将所选课程的主题只呈现一次,然后在其各自主题内显示每个主题的主题
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多