【问题标题】:JSF2.0 Partial Render with ui:define带有 ui:define 的 JSF2.0 部分渲染
【发布时间】: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 视图已经在 J​​SF 生命周期的“恢复视图”阶段重新构建。关于如何克服这个问题的任何想法?

更新

看来我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener} 有一个 @SessionScoped @ManagedProperty,它在单击 CommandLink 后更新。内容面板实际上是通过#{myBean.data} 加载数据,即@RequestScoped。这个#{myBean.data} 没有正确重新加载数据。我通过将getData() 方法直接传递给@SessionScoped bean 来解决它。

可能有点混乱。但我的结论是:它确实可以部分渲染通过 facelet 模板加载的组件 (ui:define / ui:insert)

【问题讨论】:

  • 如果您已经回答了自己的问题,也许您可​​以将您的解决方案放入答案框中并接受它,以便其他人知道此问题已解决。添加解决它的代码可能对遇到相同问题的其他人有所帮助。

标签: java ajax jsf jsf-2


【解决方案1】:

看来我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener} 有一个 @SessionScoped @ManagedProperty,它在单击 CommandLink 后更新。内容面板实际上是通过@RequestScoped 的#{myBean.data} 加载数据。此 #{myBean.data} 未正确重新加载数据。我通过将 getData() 方法直接传递给 @SessionScoped bean 来解决它。

可能有点混乱。但我的结论是:它确实可以部分渲染通过 facelet 模板加载的组件 (ui:define / ui:insert)

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2012-09-21
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多