首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种棱角分明的方法,用于判断内容是否溢出ngFor中的容器,如果是,则从哪个项目开始溢出

一种棱角分明的方法,用于判断内容是否溢出ngFor中的容器,如果是,则从哪个项目开始溢出
EN

Stack Overflow用户
提问于 2019-09-27 02:12:15
回答 2查看 444关注 0票数 0

我想要一种方法来判断容器内部的组件是否溢出容器。如果它确实溢出了,我想获取导致溢出的项的索引。

这个问题的目的是在溢出时添加一个显示更多按钮,并将对象分成两部分:适合的项和不适合的项。

组件由*ngFor生成。

这里有一个最小的例子来说明发生了什么

代码语言:javascript
复制
<div class="my-container">

  <div 
    class="item"
    *ngFor="let item of items; let i = index; trackBy: trackById"
  >
    {{ item.val }}
  </div>

<div>
代码语言:javascript
复制
.my-container {
  overflow: hidden;
  max-width: 100%;
  display: flex;
}

当我的容器水平填充项目时,如果有足够的项目,它可能会水平溢出。我想知道它是否溢出,并确定导致溢出的项的索引。

这是我的尝试:

代码语言:javascript
复制
  // this fn gets called in ngOnChanges

  determineShowMore() {
    const container = document.querySelector('.my-container') as HTMLElement;
    const viewItems: any = container ? Array.from(viewsContainer.children) : [];

    let totalWidth = 0;

    viewItems.forEach((x: HTMLElement) => {
      totalWidth += x.offsetWidth;
    });

    const isOverflow = totalWidth > viewsContainer.offsetWidth ? true : false;

  // missing: determine which item causes the overflow
  }

它似乎不能很好地工作,也许是因为它发生在html完全呈现之前?我不能在ngAfterViewInit()上运行这个fn,因为我的items可以动态更改,我需要它在每次更改时运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-27 03:06:36

首先,如果你使用的是Angular,我不会使用document.querySelector()。您可以导入ElementRef并使用它。其次,我认为你可以通过每次添加一个元素时运行一个回调来实现这一点。尝试从单个项目创建子组件,并使用事件发射器告诉父组件是否添加“阅读更多”按钮。

代码语言:javascript
复制
import { Component, ElementRef, Output, EventEmitter } from '@angular/core'

@Component({
  selector: 'single-item',
  templateUrl: './single-item.component.html',
  styleUrls: [ './single-item.component.css' ]
})
export class SingleItem {

  @Input index: number
  @Output onAddItem = new EventEmitter()

  constructor(private elementRef: ElementRef) {
    const container = this.elementRef.nativeElement
    const wrapper = this.container.parentElement
    this.onAddItem.emit({
      isOverflowed:
        container.clientHeight > wrapper.clientHeight ||
        container.clientWidth > wrapper.clientWidth,
      index: this.index:
    })
  }

}

然后在父级的HTML中:

代码语言:javascript
复制
<div class="container">
  <ng-container
    *ngFor="let item of items; let i = index; trackBy: trackById"
  >
    <single-item
      (onAddItem)="handleAddItem($event)"
      [index]="i"
    >
      {{ item.val }}
    </single-item>
  </ng-container>
</div>

在JS中,您可能会这样处理它。

代码语言:javascript
复制
  overflowingIndex: number

  handleAddItem(event) {
    if (!event.isOverflowed) return false
    this.overflowingIndex = this.overflowingIndex || event.index
    // add your read more button here
  }
票数 3
EN

Stack Overflow用户

发布于 2019-09-27 02:31:22

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58122519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档