繁体   English   中英

带有ui:define的JSF2.0部分渲染

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM