2

我想显示一个带有多个缩略图的自定义画廊。单击其中一个时,将显示一个覆盖面板,其中包含一个图形图像,图像质量更高。由于每个高质量图像大约 5MB,我只想按需加载它们。

我已经尝试过使用“rendered”属性,但这似乎也没有奏效。我还尝试了使用 javascript 函数的“onclick”,但这也没有产生预期的结果。

<p:graphicImage value="#{dataHolderBean.imageHolderBean.loadFullSizeImage()}"
class="centeredImageOverlay" cache="false">
<f:param name="currentImageId" value="#{images.imageId}" />
</p:graphicImage>

单击另一个图像时,我只想调用 value="#{dataHolderBean.imageHolderBean.loadFullSizeImage()}" 这个方法。

4

2 回答 2

3

您为什么不寻找一种可以延迟加载覆盖面板内容的解决方案?对我来说,这听起来像是一个更通用的解决方案(它里面的任何东西都会被懒惰地加载)你站着,并且更有可能已经实现了一些东西。

来自p:overlayPanel(重点是我的)的 PrimeFaces 展示

覆盖面板

OverlayPanel 是一个通用的容器组件,可以覆盖页面上的其他组件。值得注意的功能是自定义定位、可配置的事件和效果。通过动态选项也支持延迟内容加载以减少页面加载时间,启用时,overlayPanel 将在显示之前加载内容。

来自 PrimeFaces 文档

动态模式

动态模式启用内容的延迟加载,在此模式下,面板的内容不会在页面加载时呈现,而是在面板显示之前加载。内容也被缓存,因此连续显示不会再次加载内容。此功能对于减小页面大小和减少页面加载时间很有用。

因此延迟加载是通过即使在展示dynamic中也有示例的属性完成的

<p:commandButton id="movieBtn" value="Dynamic" type="button" />
<p:overlayPanel id="moviePanel" for="movieBtn" hideEffect="fade" dynamic="true" style="width:600px" modal="true">
    ...
</p:overlayPanel>
于 2019-02-11T09:51:43.240 回答
3

您可以在 bean 中使用内置的 LazyDefaultStreamedContent 来延迟初始化流:

streamedContent = new LazyDefaultStreamedContent("application/vnd.ms-excel", "myExcel") {
    @Override
    protected InputStream initStream()
    {
          return new FileInputStream(...);
    }
};
于 2019-02-11T15:02:53.667 回答