【问题标题】:Set ViewChild based on a condition根据条件设置 ViewChild
【发布时间】:2018-11-06 17:18:48
【问题描述】:

在我的 Angular 7 应用程序中,我在树形视图中有超过 5000 个元素。我需要访问已选择的 DOM 元素,所以我可以使用类似scrollIntoView 的东西。基本上我的伪代码如下所示:

if selected element is not visible
    call scrollIntoView on the element

问题是,每次按下键盘时我都需要调用它(向上和向下箭头)。我试过传入$event 来查找前一个元素、下一个元素等等,所以我可以简单地在那个元素上调用scrollIntoView(),但我认为这不是一个好主意。它涉及大量递归(因为树视图是嵌套的)并且我的 HTML 永远不会改变(除非我也更新代码)。

是否可以根据条件设置ViewChild()?这样我就可以简单地做this.selectedElement.nativeElement.scrollIntoView() 或类似的事情。除非有更好的主意?

【问题讨论】:

  • 也许这个链接会对你有所帮助:stackoverflow.com/questions/53149659/….
  • @ShashikantDevani 除了我只需要我的唯一元素。
  • 那么你可以从ngFor传递索引
  • @ShashikantDevani 这有什么帮助?

标签: angular angular7


【解决方案1】:

这个不是很清楚,不过如果我理解正确的话,你可以使用@ViewChildren,基本上就是几个@ViewChild。

This stackblitz 展示了如何使用它,并且如您所见,它非常易于使用。

import { Component, QueryList, ElementRef, ViewChildren } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `<hello name="{{ name }}"></hello>
<div 
  *ngFor="let index of [1, 2, 3, 4, 5]" 
  (mouseover)="hovered(divs)"
  #divs>
  This is the div n° {{ index }}
</div>`,
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {

  @ViewChildren('divs') divs: QueryList<ElementRef<HTMLDivElement>>;

  name = 'Angular';

  hovered(div: HTMLDivElement) {
    // Getting from the query list
    const corresponding = this.divs.find(_div => _div.nativeElement === div).nativeElement;

    // they are the same
    console.log(corresponding);
    console.log(corresponding === div);
    console.log(div);
  }
}

【讨论】:

  • 问题是我只想要一个 ViewChild(或 ViewChildren)。 ViewChildren 可以工作,但我需要一种方法来有条件地说“如果我的 viewchild 有 xxx 属性”,我可以以某种方式进行设置,那么它就可以工作。我只需要一个元素,也就是被选中的元素。
  • 正如您在 stackblitz 中看到的那样,它只返回一个元素,其中包含您在其上声明的任何内容(例如,active 类)。
  • 好的,让我再分解一下,这样更容易理解。看看这个 StackBlitz:stackblitz.com/edit/angular-j7ovfn - “对应”元素永远不会更新为新元素,即使我将所选元素更改为新元素。要对其进行测试,请单击列表中的第一个元素,然后按向下箭头键。
  • 那是因为你的代码不应该做你期望它做的事情。在this stackblitz 中,您可以看到它工作得很好(我没有保护箭头键,所以不要点击第一个或最后一个项目来测试它!)
  • 嵌套元素呢?正如我解释的那样,我在 OP 中有。使用简单的 HTML,其中我只有一个 DIV 紧挨着一个,这很容易。但是当涉及到嵌套元素时(想想 ul 和 li 标签),情况就完全不同了。这是一个示例(演示中只有向下箭头有效),其中我嵌套了 ul 和 li 标签:stackblitz.com/edit/angular-eavqd6(与您提供的其他 StackBlitz 有点不同,但应该有意义)。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 2020-07-08
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多