【问题标题】:Modify dynamically JSF snippets by h:commandlink通过 h:commandlink 动态修改 JSF 片段
【发布时间】:2011-09-29 23:15:47
【问题描述】:

我在 page1 中有一个 h:commandlink 控件。控件使用 f:ajax 调用以下 h:panelgroup :

我在 page2 (sn-p) 中有一个 h:panelgroup 控件,其中包含一个 ui:include。 我在 page3 (sn-p) 中有一个 h:panelgroup 控件,其中有一个 ui:include。

现在根据第1页的选择,我想通过点击h:commandlink控件来切换sn-ps。

我有一个大问题:似乎只有当我在命令链接上单击两次时,才会更改 sn-p - 而不是单击一次。

我尝试删除 f:ajax 来渲染面板组,但仍然无法正常工作...

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    此问题有两个潜在原因。

    1. <f:ajax> 正在完全重新渲染 另一个 <h:form>,而不是它所在的位置。这样,另一个窗体的视图状态将丢失,这需要调用其他形式两次才真正执行。

      解决方案是不重新渲染另一个<h:form>,而只重新渲染该表单中的一些容器组件。例如

      <h:form id="otherForm">
          <h:panelGroup id="content">
              ...
          <h:panelGroup>
      </h:form>
      

      <f:ajax render=":otherForm:content" />
      

    2. &lt;h:commandLink&gt; 或其任何父组件上存在rendered 属性时,它必须在回发请求的应用请求值阶段评估true 以获得JSF 在该请求的调用操作阶段调用与 &lt;h:commandLink&gt; 关联的 bean 操作。也许 bean 是请求范围的和/或 bean 内部的一些奇怪/不合逻辑的流导致 rendered 属性未正确保留。

      最好的办法是在@ViewScoped bean 中维护rendered 条件,并让它的操作方法返回voidnull,这样只要您与同一个视图交互,bean 就会存在。仅在操作方法期间更改 rendered 条件,而不是在 setter/getter 内部更改。

    【讨论】:

    • 看来是第二个问题导致了这个问题。请求流中的某些东西使 getter 在 setter 之前被提升......这让我有一段时间有些困惑。
    • Getters/setters 应该有唯一的任务来返回和设置属性,而不是做一些业务工作。那里有监听器和操作方法。
    • 如果我保存 sn-p 的链接字符串并使用 getter/setter 更改它,我没有能力在流程中进行更改......你给了我一个很好的方向问题从哪里开始......解决方案是将回发方法从POST更改为GET,这样我在Getter / Setter逻辑开始之前使用了另一个ActionListner。谢谢@BalusC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2017-08-04
    • 2012-12-28
    相关资源
    最近更新 更多