【发布时间】:2011-06-03 02:39:12
【问题描述】:
我正在使用 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>
介绍就这么多。当我单击命令链接“单击我”时,我正在调用我的侦听器。此侦听器在 backingbean 中设置一个引用,以根据我单击的链接动态加载内容。
我第一次按下命令链接时没有完成此渲染。好吧,它基本上看起来像是首先重新渲染然后调用侦听器,而不是相反。所以当我第一次点击时,似乎什么都没有发生。当我第二次单击时,我看到了为第一次单击设置的内容。当我第三次点击时,我看到了第二次点击的内容。
我认为这是因为 ui:define 视图已经在 JSF 生命周期的“恢复视图”阶段重新构建。关于如何克服这个问题的任何想法?
更新
看来我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener} 有一个 @SessionScoped @ManagedProperty,它在单击 CommandLink 后更新。内容面板实际上是通过#{myBean.data} 加载数据,即@RequestScoped。这个#{myBean.data} 没有正确重新加载数据。我通过将getData() 方法直接传递给@SessionScoped bean 来解决它。
可能有点混乱。但我的结论是:它确实可以部分渲染通过 facelet 模板加载的组件 (ui:define / ui:insert)
【问题讨论】:
-
如果您已经回答了自己的问题,也许您可以将您的解决方案放入答案框中并接受它,以便其他人知道此问题已解决。添加解决它的代码可能对遇到相同问题的其他人有所帮助。