Angular2:打开包含在悬停时延迟的图像的 ngbPopover

Angular2: Open ngbPopover containing image delayed on hover

首先:我创建了一个 plunkr 来显示问题:http://plnkr.co/edit/5IhhqtofCvqqr5x9P0De?p=preview

我想在悬停元素时延迟打开 ngbPopover(带有图像)。 我将 (mouseover)(mouseleave)triggers="manual" 结合使用。在打开函数中,我使用 setTimeout 触发弹出窗口打开。一切正常,但不是在第一次执行时。正如您在图片上看到的那样,弹出框放置错误。

在第二个、第三个……悬停时一切正常。当我删除超时功能时,它也可以工作,但这不是我的目标。

所以,这是一个棘手的问题!在我提出解决方法之前(因为我不确定是否有 "fixing" 它的方法),让我解释一下这里发生了什么。

为了正确定位元素,我们需要知道要定位的元素的确切大小。在您的特定情况下,只有在 浏览器加载图像后 才知道确切的大小。

有两种基本方法可以解决此问题:

  • 重新定位弹出窗口图像加载后
  • 预先给图片一个尺寸。

图像加载后 重新定位弹出窗口的问题 是您必须收听 <img>onload 事件然后强制重新定位-定位。这很麻烦,今天的 ng-bootstrap popover 实现没有任何强制重新定位的方法(尽管我们可以轻松添加一个!)。

我建议的是给 <img> 元素初始大小,这样当我们定位东西时,在图像加载之前就知道确切的尺寸。前任。 width="200px" height="140px" 像这样:

<ng-template #popContent let-greeting="greeting">
 <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Crested_Tern_Tasmania_%28edit%29.jpg/1600px-Crested_Tern_Tasmania_%28edit%29.jpg" 
width="200px"
height="140px">
</ng-template>

使用固定尺寸的图像,事情开始按预期工作:http://plnkr.co/edit/QUxBX1KCPVaAkIfBH0P8?p=preview

尝试使用这个 属性 它是最简单和最干净的解决方案。 基本上,触发器的默认值是点击。 但是你是否可以将 属性 更改为 触发器="hover" 它会帮助你起来