p:commandButton update在ui:include中不起作用

时间:2010-12-27 18:05:17

标签: ajax jsf primefaces

我想通过PPR更新页面的一部分。 这是我要更新的页面的一部分:

 <h:panelGroup id="aggiungiAuto"
                  rendered="#{!autoBean.operazioneOk}">
        <ui:include src="../component/aggiungi_auto.xhtml"/>
 </h:panelGroup>

虽然这是aggiungi_auto.xhtml中的commandButton

 <p:commandButton value="Submit"
                  update="growl aggiungiAuto aggiungiFoto"
                  actionListener="#{autoBean.insert}"/>

任何想法?

2 个答案:

答案 0 :(得分:6)

JS / Ajax在客户端工作,而不是在服务器端工作。 JSF在服务器端工作,而不是在客户端。当您指示JSF不将组件呈现为HTML时,客户端中不会出现任何内容,因此JS / Ajax将无法找到要刷新/更新的HTML元素。

您需要将其包装在另一个<h:panelGroup>

<h:panelGroup id="aggiungiAuto">
    <h:panelGroup rendered="#{!autoBean.operazioneOk}">
        <ui:include src="../component/aggiungi_auto.xhtml"/>
    </h:panelGroup>
</h:panelGroup>

这样<span id="aggiuniAuto"> 始终总是存在于客户端,因此JS / Ajax将能够使用JSF生成的新HTML数据更新它。

答案 1 :(得分:0)

所以我在PrimeFaces上遇到了这样的问题(这次,以上答案还不够),我也找到了解决方法。

我认为部分问题是我递归使用ui:include。无论出于何种原因,PrimeFaces都非理性地导致UI组件不同步地绑定到后端数据。例如,当点击“添加”按钮时,会在用户界面中创建一个新值,但随后该数据会从以下部分的值中提取出来,等等。


解释? “ [o]在一个有范围的bean中,将一个隐藏字段添加到表单中以保存回发数据[;]如果该字段未包含在进程中,则该bean将失去上下文。”此特定问题尤其在ui:include递归中很普遍。 解决方案(均与p:commandButton或其他可操作的组件有关):

  • 确保updateprocess指向JSF组件,而不是常规HTML组件。
  • update,如果下一个作用域中断了(与绑定不同步)。
  • 使用styleClass进行更新(而不是PF ID或@this:@parent之类的东西),以便使用jQuery代替PF,例如:@(.fieldset-class)
  • process所更新的范围。 (这对于回发数据是必需的,以便Bean保持其更新上下文...)如果按钮是由过程值组件包含的,则此处不需要process="@this"
  • 对于所有不需要验证的按钮,请设置immediate="true"
  • 如果以上方法均无效(可能是由于ui:include递归而导致的“添加”按钮发生),请设置process="@this"immediate="true"update="@none",然后oncomplete="remoteCommandName();",并使用p:remoteCommand来代替上面提到的processimmediateupdate
  • 如果以上方法均无效(其他按钮也发生了这种情况,可能是由于在ui:include递归中又一层了)...将h:panelGroup包裹在下一个{{1 }},然后更新按钮本身中的 PrimeFaces ID ,同时保持其c:forEach调用,如上所示。
  • 如果以上方法均无效(我又发生了)...请尝试以下代码:
    • remoteCommand中:p:commandButton(s)
    • oncomplete="$('.FixButtonSC').click();"中,其样式类为FieldsetSC:
p:fieldset

希望有帮助...