我正在使用facelet模板,并且我认为ui:define和JSF生命周期遇到了问题。我的template.xhtml在标题中包含一个固定菜单,简化了它具有如下链接:
<h:commandLink value="Click Me">
<f:ajax update="#{myBean.listener}" render="contentpanel"/>
</h:commandLink>
template.xhtml还包含ui:insert语句:
<ui:insert name="content">
<h:outputLabel value="content placeholder"/>
</ui:insert>
现在我有一个content.xhtml看起来像:
<ui:composition template="template.xhtml">
<ui:define name="content">
<h:panelGroup id="contentpanel"/>
</ui:define>
</ui:composition>
这么多的介绍。当我单击命令链接“ Click Me”时,我正在呼叫我的监听器。该侦听器在backingbean中设置一个引用,以根据我单击的链接动态加载内容。
第一次按下命令链接时,不会完成此渲染。好吧,基本上看起来像是先进行重新渲染,然后再调用侦听器,而不是相反。因此,当我第一次单击时,似乎什么都没有发生。当我第二次单击时,会看到为第一次单击设置的内容。当我第三次单击时,我看到第二次单击的内容。
我认为这是因为ui:define视图已经在JSF生命周期的“还原视图”阶段中进行了重建。关于如何克服这一点的任何想法?
更新
似乎我的假设是错误的。造成这种情况的原因似乎有所不同。
#{myBean.listener}
具有一个@SessionScoped @ManagedProperty
,在单击CommandLink后会对其进行更新。内容面板实际上是通过#{myBean.data}
加载数据的。此@RequestScoped
没有正确重新加载数据。我通过将#{myBean.data}
方法直接传递给getData()
bean来解决它。可能会有些混乱。但是我的结论是:确实可以部分渲染通过facelet模板(
@SessionScoped
)加载的组件 最佳答案
似乎我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener}具有一个@SessionScoped @ManagedProperty,在单击CommandLink之后会对其进行更新。内容面板实际上是通过@RequestScoped的#{myBean.data}加载数据的。 #{myBean.data}无法正确重新加载数据。我通过将getData()方法直接传递给@SessionScoped bean解决了它。
可能会有些混乱。但是我的结论是:它确实可以部分渲染通过facelet模板加载的组件(ui:define / ui:insert)
关于java - 带有ui:define的JSF2.0部分渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4589087/