在滚动上重新定位 CdkConnectedOverlay

2024-01-22

我正在尝试使用CdkConnectedOverlay单击按钮时显示叠加层。它大部分工作正常,但覆盖层没有在滚动时重新定位。我确信我遗漏了一些小东西,但我一生都无法弄清楚。

我在用着Angular 7.2.8 and Angular CDK 7.3.3

认为这可能与缺少 cdk 样式有关(类似于this https://github.com/angular/components/issues/10821),但我导入了那些;如果缺少样式,我希望它一开始就无法正确显示。我的只是不会在滚动上重新定位。

模板:

<button
  (click)="isOpen = !isOpen"
  cdkOverlayOrigin
  #trigger="cdkOverlayOrigin"
>Show</button>

<ng-template
  cdkConnectedOverlay
  [cdkConnectedOverlayOrigin]="trigger"
  [cdkConnectedOverlayOpen]="isOpen"
>
 Popover content
</ng-template>

成分:

@Component ( {
  selector: 'app-popover',
  templateUrl: './popover.component.html',
  styleUrls: [ './popover.component.css' ],
  changeDetection: ChangeDetectionStrategy.OnPush,
} )
export class PopoverComponent {
  isOpen: boolean = false;
}

还有一个 Plunkr 显示了这个问题:https://stackblitz.com/edit/angular-7-popover https://stackblitz.com/edit/angular-7-popover

Update:

仅当弹出窗口位于其父元素溢出的元素中时,才会发生滚动重新定位问题overflow: auto。如果页面溢出,那么它工作正常。您可以使用以下模板查看此行为

<div style="height: 300px; overflow-y: auto">
  <!-- Scroll re-positioning does not work when scrolling in here -->
  <div style="height: 100px"></div>
  <app-popover>
    Popover content
  </app-popover>
  <div style="height: 400px"></div>
</div>

<div style="height: 100px;"></div>
<!-- Scroll re-positioning works when scrolling here -->
<app-popover>
  Popover content
</app-popover>
<div style="height: 1200px;"></div>

我还更新了 stackblitz 以显示此问题。


cdk 文档有时并不容易理解,而且其中到处都是隐藏的宝石:)

here https://material.angular.io/cdk/overlay/overview#scroll-strategies它指出;

每个策略通常都会注入 ScrollDispatcher(来自 @angular/cdk/scrolling),以便在滚动发生时收到通知。

我从这句话中了解到的是Overlay重新定位自己以响应来自的事件ScrollDispatcher。那么,这些滚动事件从哪里来呢?

不幸的是,文档中没有任何关于此的信息。所以我查看了代码并发现this https://github.com/angular/components/blob/aa2236820da4b14fb4fd9e6a57a05660b615da2c/src/cdk/scrolling/scroll-dispatcher.ts#L163

  /** Sets up the global scroll listeners. */
  private _addGlobalListener() {
    this._globalSubscription = this._ngZone.runOutsideAngular(() => {
      return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());
    });
}

意思是ScrollDispatcher监听滚动事件默认窗口.

在上面的情况下,它会响应窗口滚动时的事件,但不会响应内部容器。这符合我们迄今为止收集到的信息。

在这里我们可以得出结论Overlay不会通知内部容器内发生的滚动事件,我们需要做的就是向内部容器注册ScrollDispatcher

在此刻cdk可滚动 https://material.angular.io/cdk/scrolling/api#CdkScrollable指令介入救援并放置cdkScrollable在滚动内容器上解决了这个问题。

<div cdkScrollable style="height: 300px; overflow-y: auto">

这是一个工作demo https://stackblitz.com/edit/angular-7-popover-4ij7vh

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在滚动上重新定位 CdkConnectedOverlay 的相关文章

  • 取消按键上的拖动 Angular cdk 拖放

    我正在一个应用程序中实现从角度材料 CDK 的新拖放功能 并且我正在尝试取消按下元素的拖动事件Esc 我的意思是 我开始拖动元素 但是如果我按Esc当我拖动元素时 它应该回到我开始拖动它的位置 到目前为止我还没有找到一种方法来做到这一点 有
  • 获取 cdk-virtual-scroller 中的静态组件引用? (参考文献已回收)

    我们最近将可滚动列表转换为 CDK Virtual Scroller Angular 7 2 12 和 Angular cdk 7 3 7 简而言之 似乎VirtualScrollViewport正在回收组件实例 而不仅仅是文档建议的模板
  • Angular CDK 拖放绝对定位元素而不跳转

    我正在尝试使用 CDK 中的 Angular Drag Drop 来实现带有可拖动元素的基本侧边栏 用户可以将它们拖放到 内容 区域中的任何位置 这意味着 元素最终应该是绝对定位的 并且应该能够存在于用户想要的任何地方 包括相互重叠 我正在
  • 错误:supportsScrollBehavior 未声明为可配置

    我正在尝试监视一个函数supportsScrollBehavior有角的platform服务如下 import as platform from angular cdk platform describe Supporting Scroll
  • 使用 Angular 7 Material CDK 进行嵌套拖放

    我有一个拖放列表的嵌套树 不是树组件 当拖动另一个下拉列表中包含的下拉列表中的项目时 两个下拉列表都会触发 Enter Exit 事件 这意味着当一个项目被删除时 它可以被放入内部下拉列表或容器下拉列表中 具体取决于它被删除的地方 注意 这
  • Mat-Table :将一行滚动到角度 2 的视图中

    使用角度材料垫表时是否可以将特定数据行滚动到视图中cdk table 我正在尝试实现键盘滚动 但没有成功 我现在已经可以使用了 不完美但有效 请参阅我之前的消息中提到的堆栈闪电战示例 https stackblitz com edit me
  • 带有粘性标题和水平、垂直滚动条的垫表

    我有一个垫子表 带有粘性标题和页面的垂直滚动 它工作正常 直到我动态添加更多列并出现水平滚动条 粘性标题停止工作 有什么办法让它发挥作用吗 请看例子 https stackblitz com edit angular hdg9xh http
  • 如何在 Angular 7 中禁用目标 cdkDropList 中的元素移位/移动

    我有 2 个列表 左侧的首都城市和右侧的国家 地区 我希望能够将首都移至国家列表中 并允许用户将首都移至该国家 地区 问题是国家 地区列表元素开始移动 移动 以允许插入大写字母 但我只想放在顶部 如果匹配 请提供一条消息并从两个列表中删除城
  • 如何将仓位策略添加到 Angular CDK 叠加层?

    如何添加定位策略 ConnectedPositionStrategy 到 Angular CDK 覆盖 我尝试通过指定它positionStrategy属性并将其传递给overlay create import Overlay Connec
  • Angular Material 2 中的 md-table

    我正在与角材料表 https material angular io components table overview在Html代码中 有
  • mat-menu 穿透“cdk 覆盖雾”

    This 堆栈闪电战 https stackblitz com edit angular txgxyt file styles css SB 显示了问题 CSS类 WHYYYYY显示了我面临的 两个 问题 为了使垫菜单在悬停时打开 我需要设
  • 在滚动上重新定位 CdkConnectedOverlay

    我正在尝试使用CdkConnectedOverlay单击按钮时显示叠加层 它大部分工作正常 但覆盖层没有在滚动时重新定位 我确信我遗漏了一些小东西 但我一生都无法弄清楚 我在用着Angular 7 2 8 and Angular CDK 7
  • “Angular cdk Drag drop”用于将列表中的项目拖放到容器中(无序)

    我知道 cdk 拖放可以很好地处理列表 并且有很多示例 但我想做的是 一侧是列表 另一侧是容器 容器中的物品应该位于容器中的任何位置 并且可以由 x 和 y 轴固定 因此 当从列表中拖放到容器中的某个 x y 处时 该项目应保持该位置 请帮
  • 在使用递归模板表示的 n 元树中放置元素时,角度拖放不起作用

    我对有角度的材料拖放不熟悉 我的应用程序正在使用 n 叉树 并且由于我不知道它的先验形式 因此我被迫使用递归模板来表示它 在过去的几天里 我一直在尝试使用 Angular 材质拖放来重新排序兄弟姐妹 如果我删除根节点 一切都会正常工作 但我
  • 在 Angular Material 2 表中使用虚拟滚动和 @angular/cdk-experimental

    我有一个表显示很多行 我想优化它的性能 我通过使用虚拟滚动技术找到了解决方案 这是一个例子Angular Material CDK 虚拟滚动视口组件 https github com angular material2 tree maste
  • Angular 6 MatTable 1000 行性能

    我在项目中使用角度材质 并使用 Mat Table 渲染每个表 1000 个产品 行 当将表的分页 我们使用后端分页 更改为 1000 行时 性能变得非常慢 我什至无法在文本框中写入 我尝试调试这个问题 所以我将日志放在一列模板上 这样我就
  • 是否可以禁用 cdkDrag 子元素上的拖动?

    我正在使用 Angular Material 中的 Angular CDK 拖放 请参阅文档here https material angular io cdk drag drop overview 我想知道是否有可能禁用在子元素上拖动cd
  • 使用 Angular 4 将新行添加到 mat-table 中

    如何从输入字段手动将新行添加到 Angular Material 表中 请看这张图片 如果我添加状态名称和状态代码 它应该出现在下表中 请帮助我如何使用 Angular 4 来实现它 我整理了一个简单的示例 应该可以很好地提示您从哪里开始
  • 数字和文本列的垫排序问题

    我有角度材料数据源 角度材料版本是 5 0 3 排序正在进行中 但是对于某些列 它的排序不正确 那里有数字和文字 例如 排序结果如 XXX 1 1tesxt 1 OPD OXD 12
  • CSS flexbox 内的 Angular CDK 拖放问题

    我在使用 Angular CDK 中的拖放模块时遇到了问题 我在容器 div 中使用它 该容器具有 除其他外 以下 CSS 属性 display flex flex wrap wrap The flex wrap属性在这里 以便如果包含的可

随机推荐