<ui:repeat value="#{bean.allResults}" var="result">
<ui:fragment rendered="#{result.condition1}">
<ui:include src="/item1.xhtml">
</ui:fragment>
<ui:fragment rendered="#{result.condition2}">
<ui:include src="/item2.xhtml">
</ui:fragment>
<ui:fragment rendered="#{result.condition3}">
<ui:include src="/item3.xhtml">
</ui:fragment>
<ui:fragment rendered="#{result.condition4}">
<ui:include src="/item4.xhtml">
</ui:fragment>
</ui:repeat>
在使用JSF / JSTL / Facelets时,我有几个关于最佳实践的问题 我有一个看起来像上面代码的JSF页面。假设这个循环返回10个结果,对于每个结果,只有1个条件evalutates为true。 因此,一旦加载,用户将在html页面上看到10个结果。
尽管html中只显示10个项目,但组件树将包含40个项目,它将包含渲染评估为false的项目。 上述行为是否准确?
如果1为真,我们可以在组件树中有很多隐藏的组件是一个性能问题,让我们说它是400项而不是40项?
在Faceletes或JSF中有一个条件标签处理程序,其行为类似于c:if和不包括树中的组件?或者我应该使用c:if if last a resort?我试图避免使用JSTL。
感谢。
答案 0 :(得分:3)
尽管html中只显示10个项目,但组件树将包含40个项目
您是正确的,即使渲染为false,包含的组件也将成为组件树的一部分。但是,<ui:repeat>
不会在组件树中复制其内容,但会在JSF生命周期的每个阶段重复迭代其子组件。因此,组件树将只包含4个“项目”组件。
如果1为真,我们可以在组件树中有很多隐藏的组件是性能问题,让我们说它是400项而不是40项?
正如related answer中所记载的那样,它可能需要注意很多组件。 (我有一段时间做了一个基准测试。我没有手头的数据,但IIRC,添加了600个未渲染的组件,为Web应用程序响应时间增加了300毫秒。)
是否有一个条件标记处理程序,其行为类似于c:if和将不包含树中的组件?或者我应该使用c:if if last a resort?
带有值表达式的TagHandlers有各种各样的限制,所以我建议尽可能保持清晰。但是,实际上,为了防止包含在组件树中,我也使用<c:if>
。