[英]JSF2.0 Partial Render with ui:define
我正在使用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生命周期的“恢复视图”阶段中进行了重建。 关于如何克服这一点的任何想法?
UPDATE
似乎我的假设是错误的。 造成这种情况的原因似乎有所不同。 #{myBean.listener}
具有一个@SessionScoped @ManagedProperty
,在单击CommandLink之后会对其进行更新。 contentpanel实际上通过@RequestScoped
的#{myBean.data}
加载数据。 #{myBean.data}
无法正确重新加载数据。 我通过将getData()
方法直接传递给@SessionScoped
bean解决了它。
可能会有些混乱。 但是我的结论是:它确实可以部分渲染通过facelet模板加载的组件( ui:define / ui:insert
)
似乎我的假设是错误的。 造成这种情况的原因似乎有所不同。 #{myBean.listener}具有一个@SessionScoped @ManagedProperty,在单击CommandLink之后会对其进行更新。 内容面板实际上是通过@RequestScoped的#{myBean.data}加载数据的。 #{myBean.data}无法正确重新加载数据。 我通过将getData()方法直接传递给@SessionScoped bean解决了它。
可能会有些混乱。 但是我的结论是:它确实可以部分渲染通过facelet模板加载的组件(ui:define / ui:insert)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.