使用 ui:repeat 和 b:carousel?

2024-05-17

环境:

我正在使用 JSF2.2、Bootsfaces 0.9.1、Primefaces 6.0、JEE7 和 Hibernate 5.2 以及 MySQL 5.7 DB。

我拥有的:

我有一个包含一组图像的模型。该集合包含我的自定义 Image 类的实例,该类保存图像的值,如标题、描述和文件名。

图像存储在文件系统上,我使用 MySQL DB 来存储模型。我尝试在我的网络应用程序的视图上显示图像,一切正常。我还显示了一些来自 bootsfaces 的带有 b:carousel 标签的图像,一切都按照我的预期进行。

我尝试做的事情:

我尝试的下一步是用于显示一组不同尺寸的图像。以下代码是我尝试实现这一点的尝试:

<b:carousel id="carousel" style="width: 800px; height: 400px;">
    <ui:repeat value="#{modelDetailBean.modelImages}" var="img">
         <b:carouselItem>
              <b:image value="#{modelDetailBean.getImage(img)}"/>
         </b:carouselItem>
    </ui:repeat>
</b:carousel>

我发现我的轮播中没有显示任何图像。然后我添加了至少 1 个修复来查看它是否正常工作,并认识到该组的所有图像都存在于轮播中,但是轮播没有正确考虑它们。

我的主要问题:

是否可以使用 ui:repeat 标签来填充轮播?

如果它是可能的:我怎样才能做到这一点?我在这里做错了什么?

如果不是:我必须使用哪些替代方案来使用 JSF 来实现这一点,而无需使用大量 javascript 等?


基本上,b:carousel组件需要静态项目,但是ui:repeat动态渲染它们。解决方案是改变一代b:carouselItems到早期的 JSF 生命周期阶段。

JSF 分阶段执行其生命周期,负责呈现响应的生命周期是最后一个(下面的链接对此进行了很好的解释)。这里的关键点是您仍然可以使用 JSTL,它是一个标记处理程序而不是一个组件,并且在视图构建时执行。所以,基本上,更换你的ui:repeat by c:forEach应该可以解决你的问题:

<b:carousel id="carousel" style="width: 800px; height: 400px;">
    <c:forEach items="#{modelDetailBean.modelImages}" var="img">
         <b:carouselItem>
              <b:image value="#{modelDetailBean.getImage(img)}"/>
         </b:carouselItem>
    </c:forEach>
</b:carousel>

这个技巧曾经给开发者带来了麻烦PARTIAL_STATE_SAVING在较旧的 Mojarra JSF 版本(2.1.18 及之前的版本)中,但现在不再了。无论如何,请始终记住 JSTL 在评估组件之前的行为。从下面的链接:

仅使用 JSTL 标记来控制 JSF 组件树构建的流程。使用 用于控制 HTML 输出生成流程的 JSF UI 组件。不要 将迭代 JSF 组件的 var 绑定到 JSTL 标记属性。做 不依赖 JSTL 标记属性中的 JSF 事件。

或者,忘记了b:carousel组件,您可以使用 JSF 作为纯粹的 HTML 生成器,并使用纯 Bootstrap 生成显示轮播所需的 HTML,如自己做的部分docs http://showcase.bootsfaces.net/bootstrap/carousel.jsf.

也可以看看:

  • JSF2 Facelets 中的 JSTL...有意义吗? https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense
  • 视图构建时间是多少? https://stackoverflow.com/questions/31890433/whats-the-view-build-time
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ui:repeat 和 b:carousel? 的相关文章

随机推荐