当前位置: 首页 > 知识库问答 >
问题:

如何在Angular中相互链接和路由两个ngFor循环?

充运浩
2023-03-14

我正在尝试使用角度构建一个网页。我只需要连接与第一个 ngFor 循环相关的第二个 ngFor 循环的数据。

HTML代码

<div *ngFor="let year of years">
    <h2> {{year}} </h2>   // For displaying the year row
    </div>


<div *ngFor="let month of months">
    <h4> {{month}}</h4> // For displaying the month row
    </div>


//Now i need to print all the data respect to each month and data.

year = ['2019','2018','2017','2016']

month = ['jan','feb','mar','apr','may','jun','jul', 'aug','sep','oct','nov','dec']

Output should be like 

2019 2018 2017 2016

1月 2月 3月 4月 6月 8月 8月 9月 10月 12月

(每个月和每年的所有数据都应如图所示)

2019

8月8日 - 数据

8月5日-数据

6月28日-数据

1月5日-数据

2018

12月29日-数据

12月21日-数据

10月18日-数据

(依此类推…)

如果我们点击任何一年,页面就会滚动到那一年。可能有当年全部12个月的数据,也可能只有几个月的数据。假设我们点击2018年,那么页面将滚动到2018年,然后“如果”我点击“10月”,如果有2018年10月的数据,那么它将滚动到那里,否则什么也不会发生。它不能滚动到任何其他年份的10月。


The structure of data is like 

year -- date -- data
2019 -- 8th aug -- data
2019 -- 5th aug -- data

共有3个答案

邵骏喆
2023-03-14

这是一种基于你在描述中所提供的方法。您只需要根据第一个列表的选定项目过滤第二个列表。Stackblitz演示

import {
  Component
} from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  alphaBet: string;
  english = ['a', 'b', 'c', 'd', 'e', 'f'];

  name = ['a1', 'a2', 'a3', 'a4',
    'b1', 'b2', 'b3', 'b4',
    'c1', 'c2', 'c3', 'c4',
    'd1', 'd2', 'd3', 'd4',
    'e1', 'e2', 'e3', 'e4',
    'f1', 'f2', 'f3', 'f4'
  ];

  scrollToNames(val) {
    const elems = [].slice.call(document.getElementsByClassName('names'));
    const macthes = elems.filter((item) => {
      return item.innerHTML.includes(val);
    });
    macthes[0].scrollIntoView();
  }
}
<div *ngFor="let alphabets of english">
  <h2 (click)="scrollToNames(alphabets)"> {{alphabets}} </h2>
</div>


<div *ngFor="let names of name">
  <h4 class="names"> {{names}}</h4>
</div>
赖浩荡
2023-03-14
<div *ngFor="let alphabets of english">
    <h2 (click)=scrollToLetter(alphabets)> {{alphabets}} </h2>
    </div>


<div *ngFor="let names of name">
    <h4 id="{{names}}">{{names}}</h4>
    </div>

然后在您的 TypeScript 中:

public scrollToLetter(letter) {
  console.log(`scrolling to ${letter}`);
  var id = this.name.find(function(element) {
      return element.toLowerCase().startsWith(letter);
  });
  if (id) {
      let el = document.getElementById(id);
      el.scrollIntoView();
  }
}

请记住将适当的样式应用于可滚动列表,例如:

  height: 50px;
  max-height:50px;
  overflow-y: scroll;
赵嘉悦
2023-03-14

您可以像下面这样编写第二个循环。

#1

<ng-container *ngFor="let names of name">
   <div *ngIf="names.startsWith(selectedAlphabets)">
     <h4> {{names}}</h4>
   </div>
</ng-container>

虽然这不是很好的方法,因为每次你改变选择的字母,根据它将不得不再次迭代整个列表。如果你可以改变你的名字列表到字母字符到名称列表的映射,那么它会更快,因为它可以直接选择所选字母的列表,如下所示。

#2

    import {
      Component
    } from '@angular/core';

    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent implements OnInit {

      alphaBet: string;
      english = ['a', 'b', 'c', 'd', 'e', 'f'];

      name = ['a1', 'a2', 'a3', 'a4',
        'b1', 'b2', 'b3', 'b4',
        'c1', 'c2', 'c3', 'c4',
        'd1', 'd2', 'd3', 'd4',
        'e1', 'e2', 'e3', 'e4',
        'f1', 'f2', 'f3', 'f4'
      ];

      nameMap = new Map<string, string[]>();

      public ngOnInit(){
          this.generateNameMap();
      }

      generateNameMap() {
        for (const item of this.name) {
            if (!this.nameMap.get(item.charAt(0))) {
                this.nameMap.set(item.charAt(0), []);
            }

            this.nameMap.get(item.charAt(0)).push(item);
        }
      }


      /* other code */
    }

并将第二个for循环html部分更改为如下

<div *ngFor="let names of nameMap.get(selectedAlphabets)">
  <h4> {{names}}</h4>
</div>
 类似资料:
  • 问题内容: 我想要一个for循环,该循环在每次迭代时调用异步函数。 在for循环之后,我想执行另一个代码块,但在解决for循环中的所有先前调用之前,不要执行。 目前我的问题是,在所有异步调用完成之前执行了for循环之后的代码块,或者根本不执行该代码块。 带有FOR循环的代码部分及其后的代码块(有关完整代码,请参阅fiddle): 我创建了一个jsFiddle,可以在http://jsfiddle.

  • 这篇文章是关于我在工作中发现的一个有趣的问题。

  • 问题内容: 我有两个完成。我想做以下情形:如果第一个Completable到达onComplete,则继续第二个Completable。最终结果将是第二完成的onComplete。 当我有单个 getUserIdAlreadySavedInDevice() 和Completable login() 时,这就是我的方法: 问题答案: 您正在寻找运营商。 返回一个Completable,它首先运行此C

  • 问题内容: 我有两个路线组,“动漫”和“漫画”。这些URL是/ anime/或/manga/,但它们都共享完全相同的控制器和模板 (唯一不同的是用于每个模板的配色方案,但这些颜色是在检查是否通过过滤器的过滤器中确定的)正在查看的特定项目是动漫还是漫画) : 动漫陈述定义: 漫画状态定义: 如您所见,其中已经有很多重复,我一点都不喜欢。随着我不断添加新路线,重复次数只会增加 (您已经可以看到mang

  • 我正在尝试在我的nginx服务器上设置vue路由器。我遇到的问题是,如果我直接在浏览器中输入url,我的路线就不起作用。 我尝试了vue路由器文档中描述的服务器配置,以及建议的堆栈溢出类似配置。我当前的nginx位置配置如下: 所做的就是将任何路径重定向到我的根组件(path:),而不是。这确实有意义,并且似乎只重定向到索引文件。我如何重定向直接链接的到路由在我的VueJS应用程序? 以下是我的v

  • 这是我的一个货车租赁数据库的起始代码。 如何将汽车链接到该位置。例如,CBD的位置有Wicked,Zepplin和Floyd,Penrith有Queen。因此,如果命令行参数具有“打印CBD”,那么它必须显示CBD中可用的货车。 任何帮助将不胜感激。