如何从 Angular 的弹性框中的组件中获取元素信息

Posted

技术标签:

【中文标题】如何从 Angular 的弹性框中的组件中获取元素信息【英文标题】:How to get element info from components in a flexbox in Angular 【发布时间】:2019-05-23 08:32:44 【问题描述】:

我有一个带有子组件弹性框的组件。我试图从我的父组件中获取每个组件的元素宽度等信息。我最终要做的是知道列表是否溢出,以便我可以修改可见元素的数量。如果溢出,我想在最后放置一个特殊元素,显示当前隐藏的图标数量。

我尝试过使用@ViewChildren,但不知道如何从中获取元素尺寸。我该怎么做?

<div class="file-list">
    <app-file-icon [text]="file" *ngFor="let file of files"></app-file-icon>
</div>

css:

.file-list 
  width: 200px;
  height: 120px;
  border: 1px solid grey;
  padding: 10px;
  margin: 10px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  /* overflow: hidden; */

沙盒:

https://codesandbox.io/s/j733w4w7ww

【问题讨论】:

如果没有 javascript,您将无法显示隐藏项目的数量。列表的其余部分所需的功能是什么?永久隐藏还是想要see more 按钮? @sallf 是的,更像是一场演出,但我不确定此时的确切行为。我认为这与我尝试做的第一件事无关,即限制可见元素的数量并将 +n 图标添加到列表中。我更新了示例以大致演示我的目标。 你能在这里发布更多你的代码吗?列表是如何生成的?一种方法是获取包装divbottom 位置,然后计算列表中top 位置大于该位置的项目。 【参考方案1】:

您可以依赖Element.getBoundingClientRect() 为父母和孩子,如果他们的.bottom 大于父母的(双关语),则为孩子设置私有属性。

基于此属性,您可以隐藏溢出的并在父级中计数。

https://codesandbox.io/s/q8o798v2kw

相关代码(file-icon.component.ts):

ngAfterViewInit() 
  let fileIcon = this.elemRef.nativeElement.querySelector(".file-icon"),
      b1 = fileIcon.getBoundingClientRect(),
      fileList = fileIcon.closest(".file-list"),
      b2 = fileList.getBoundingClientRect();
  this.hidden = b2.bottom < b1.bottom;

【讨论】:

以上是关于如何从 Angular 的弹性框中的组件中获取元素信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 4 从 Parent 获取子 DOM 元素引用

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

Angular 5:从组件访问元素内部 html 以获取动态生成的元素

如何从 Angular 中的类名中找到组件类的原型并获取该类原型中定义的属性值?

如何从Angular2中的父组件获取子路由的:id参数

如何从 Angular 中的异步输入中获取“就绪”值