如何在不使用Js id选择器的情况下在Angular中动态获取* ngFor中的元素

时间:2019-04-12 21:51:32

标签: javascript angular

我有一个具有引导程序下拉列表的组件,我想关注下拉列表跨度上设置的当前周

我可以通过设置id来使用普通的javascript,然后使用Jquery .focus()方法来关注它,但是我想知道是否有任何角度的7 / 7+方法使用ViewChildren等来实现。< / p>

<button class="btn dropdown-toggle"
        (click)="focusOnWeek(currentWeek)"
        type="button" data-toggle="dropdown">
  <span>Week {{currentWeek}}</span> // currentWeek = 5 need to focus on week 5 <a> tag on click of this span
</button>
<ul class="dropdown-menu">
  <li *ngFor="let week of weekList">//weekList = [1,2,3,4,5,6,7,8,9,10]>
    <a class="dropdown-item"
      Week {{week}} 
    </a>

  </li>
</ul>

单击“当前星期”按钮即可。

2 个答案:

答案 0 :(得分:2)

您可以使用ViewChildren查找要聚焦的锚元素。首先,您在锚元素上设置模板参考变量(例如#anchor

<ul class="dropdown-menu">
  <li *ngFor="let week of weekList">
    <a #anchor class="dropdown-item">Week {{week}}</a>
  </li>
</ul>

在代码中,您使用ViewChildren获得了对锚元素的引用:

@ViewChildren("anchor") anchorList: QueryList<ElementRef>;

,然后将焦点放在对应于指定星期的锚点上:

focusOnWeek(week) {
  const weekIndex = this.weekList.indexOf(week);
  const elementRef = this.anchorList.find((item, index) => index === weekIndex);
  elementRef.nativeElement.focus();
}

有关演示,请参见this stackblitz


如果在单击时菜单不立即可见,则可以使用QueryList.changes事件监视菜单项的创建。当您检测到可见的项目时,可以使用currentWeek设置焦点。

ngAfterViewInit() {
  this.anchorList.changes.subscribe(() => {
    if (this.anchorList.length > 0) {
      const weekIndex = this.weekList.indexOf(this.currentWeek);
      const elementRef = this.anchorList.find((item, index) => index === weekIndex);
      elementRef.nativeElement.focus();
    }
  });
}

有关演示,请参见this stackblitz

答案 1 :(得分:0)

请在html文件中添加以下代码

 <ul class="dropdown-menu">
      <li class="dropdown-item" [ngClass]="{'focus': currentWeek === week}" *ngFor="let week of weekList">
        <a>
          Week {{week}} 
        </a>

      </li>
    </ul>

在css文件中添加以下类

.focus{
   background-color: red;
}

确保已在focusOnWeek()函数中实现了更改检测。