2010-09-07 22 views
7

在我的JSF页面中,我有一个组合框,当选择组合框的项目时更新表格。JSF Ajax更新使命令链接在第一次点击时失败

该表格包含带有编辑链接的项目。

问题是当组合框改变了表格时,你需要点击两次链接才能进入页面。第一次点击只是刷新页面。

这里是XHTML:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <body> 
     <ui:composition template="/template.xhtml"> 
      <ui:define name="windowTitle">Comment packages</ui:define> 
      <ui:define name="content"> 
       <h3>Select the package to comment.</h3> 
       <h:form prependId="false"> 
        Section: 
        <h:selectOneMenu id="selectSection" value="#{platformService.currentSection}"> 
         <f:ajax render=":list-packages" /> 
         <f:selectItems value="#{platformService.releasePlatform.sections}" /> 
        </h:selectOneMenu> 
       </h:form> 
       <p/> 
       <h:panelGroup id="list-packages"> 
        <h:dataTable id="packageList" var="package" value="#{packageService.packages}" border="1" > 
         <h:column> 
          <f:facet name="header">Package name</f:facet> 
          #{package.name} 
         </h:column> 
         <h:column> 
          <h:form> 
           <h:commandlink action="#{commentService.commentPackage}" value="Comment"> 
            <f:param name="packageName" value="#{package.name}" /> 
           </h:commandLink> 
          </h:form> 
         </h:column> 
        </h:dataTable> 
       </h:panelGroup> 
      </ui:define> 
     </ui:composition> 
    </body> 
</html> 

我也试过用的commandButton,但你还需要点击按钮两次。

我在Maven/Jetty中运行JSF 2.0.1-FCS。

+0

为什么在f:ajax render属性中有“:list-packages”而不是“list-packages”?也许这是问题?也许表格不会被重新渲染? – amorfis 2010-09-07 15:21:16

+1

':'是因为要渲染的组件不在窗体中。 http://ocpsoft.com/java/jsf2-java/how-to-jsf-2-0-render-components-outside-of-the-form/ 该表已更新/呈现正确,但链接表需要点击两次才能进入页面。 – Anthony 2010-09-08 08:22:40

回答

4

将表格放入单个<h:form>时可以使用。从列中移除内部<h:form>,并用<h:form id="list-packages">替换<h:panelGroup id="list-packages">

我不知道如何/为什么会造成这个问题(需要更多的时间来调查),但这可能与表的状态对于知道哪一行被选中很重要有关。

2

这个问题很可能是由于这个JSF bug,你不能有一个包含从另一个表单更新的表单的ajax目标。该问题正在被视为规格问题,并被追踪here。如果你喜欢生活在边缘,bug报告有一个解决方法,涉及对jsf.js的编辑。

通过使用ajax和能够控制以execute =方式提交给服务器的内容,我个人认为每页使用单个表单都是一个很好的参数(除非在极少数情况下,例如某些文件上载和对话盒子实现),而且您不会被易于忘记的命名容器故障以及诸如此类的问题所困扰。