从JSF view metadata demystified注意到
由于此标记与当前视图元数据有关,因此它不参与 在XHTML模板中(页面作者必须确保 元素不会出现在模板或包含的页面上;它可以在一个 模板客户端),它是
<f:view>
的直接子项。
我有多个<f:viewParam>
和<f:event>
在许多XHTML页面中重复,而这些页面又是template.xhtml
的客户端。每个f:event
依赖于给定的托管bean,其中托管bean对于每个XHTML页面是不同的(但是尊重公共接口,即,对于每个相关的托管bean存在与侦听器相同的操作):
<f:view>
<f:metadata>
<!-- I want to share this across many XHTML parametrised by the bean -->
<f:viewParam name="id" value="#{particularBean.id}"/>
<f:event type="preRenderView" listener="#{particularBean.opCommon1}"/>
<f:event type="preRenderView" listener="#{particularBean.opCommon2}"/>
<!-- END SHARED PORTION -->
<f:event type="preRenderView" listener="#{particularBean.onlyForMe}"/>
</f:metadata>
</f:view>
<ui:composition template="/template.xhtml">
问:我如何封装共享的<f:viewParam>
和<f:event>
部分,以便它可以“包含”并作为公共策略片段处理,特定的托管bean(满足公共接口)通过在每个XHTML页面?
答案 0 :(得分:1)
我在我自己的一个旧项目中找到了答案(正如我发布的那样,我在几年前的某个阶段已经模糊地回忆起了这个问题)。这有效:
在def delays[T <: Data](x: enter code hereT, n: Int): List[T] ={
assert(n>0, "Register delays require n > 0")
val dx = RegInit((ZERO).asInstanceOf[T])
dx := x
if (n <= 1) List(dx) else dx :: delays(dx, n-1)
}
:
/include/shared.xhtml
在任何客户中:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
>
<f:viewParam name="id" value="#{particularBean.id}"/>
<f:event type="preRenderView" listener="#{compatibleBean.opCommon1}"/>
<f:event type="preRenderView" listener="#{compatibleBean.opCommon2}"/>
</ui:composition>