Jsf 2 使用confirmDialog删除datatable中的行

Jsf 2 使用confirmDialog删除datatable中的行,jsf-2,primefaces,datatable,Jsf 2,Primefaces,Datatable,我的问题在于从数据表中删除一项。当我点击删除按钮时,会出现一个确认对话框,确认从数据库中删除该行。如果是这样,数据将被删除,但数据表不会更新,除非我注销并登录,如果我选择另一个项目,它甚至不会被删除 <h:form id="form"> <p:panel id="panelform" header="Databases" > <p:dataTable value="#{dataMB.customersDatas}" var="item" id="

我的问题在于从数据表中删除一项。当我点击删除按钮时,会出现一个确认对话框,确认从数据库中删除该行。如果是这样,数据将被删除,但数据表不会更新,除非我注销并登录,如果我选择另一个项目,它甚至不会被删除

<h:form id="form">
   <p:panel id="panelform" header="Databases"  >
      <p:dataTable value="#{dataMB.customersDatas}" var="item" id="datas"      rowsPerPageTemplate="5,10,15,20,25,30" paginator="true" rows="10" filteredValue="#{dataMB.filteredDatas}" selectionMode="single" rowKey="#{item.id}"selection="#{dataMB.selectedData}">
       <p:ajax event="rowSelect" update=":form:dataView, :form:deleteButton, :form:viewButton" listener="#{dataMB.onRowSelect}"/>
</p:dataTable>  
                <p:panel>
                  <p:commandButton style="width: 8%;height: 100%" id="viewButton" value="View" oncomplete="dataDialogView.show()" disabled="#{dataMB.disabled}" icon="ui-icon-search" title="data details"/>                 
                  <p:commandButton style="width: 8%;height: 100%" id="deleteButton" value="Delete" oncomplete="deleteDialog.show()" disabled="#{dataMB.disabled}" icon="ui-icon-trash"/>                 
                </p:panel>
   </p:panel>
</h:form>   
     <p:confirmDialog style="position: absolute; width: 50px; border-color: blue" id="deleteData"  message="Your Database Will be completely removed . Are you sure? "                 appendToBody="true" header="Delete Data" severity="alert" widgetVar="deleteDialog">                          
      <h:form>     
         <p:commandButton id="confirm" style="width: 25%;height: 100%" value="Confirm" actionListener="#{dataMB.deleteData()}" update=":form:datas" ajax="true" oncomplete="deleteDialog.hide(); purchase.hide();" >                             
          </p:commandButton>  
                <p:commandButton id="cancel" style="width: 25%;height: 100%" value="Later" onclick="deleteDialog.hide();" type="button" />                           
      </h:form>
     </p:confirmDialog>  

JSF是基于会话的。为了在客户端浏览器和服务器之间同步状态,JSF使用一个隐藏字段javax.faces.ViewState。现在,您正在给定页面上使用两个表单:

单击表单一上的操作按钮 通过更新表格一的数据表确认表格二 因此,隐藏的输入字段viewState不再精确。我可能会尝试两种方法:

确认框必须是漂亮的JSF还是javascript解决方案也可以

<p:commandButton id="deleteButton" 
    value="Delete" 
    disabled="#{dataMB.disabled}" icon="ui-icon-trash"
    actionListener="#{dataMB.deleteData}"
    onclick="if (!confirm('really delete?')) { return false;}" />   
可能会做类似的工作

可能性二:只需重新提交整个表单或panel表单,而不仅仅是数据表。这样就可以呈现一个新的javax.faces.ViewState,表单也可以正常工作

另外,在中的某处添加一个,并在每个步骤中更新它。如果出现意外错误,这可能会在UI上显示


希望这对您有所帮助……

您说:对象被正确删除,但在您首次注销并再次登录时更新的表被正确呈现?这表示存在会话管理/缓存问题。删除所选对象后,您调试了{dataMB.customersDatas}getter方法是否返回对象的更新列表?如果不是,问题似乎出在持久性/缓存的某个地方。如果列表返回正确的数据集,请仔细检查在浏览器F5中刷新页面是否成功。此外,您可以尝试至少使用h:datatable不更新datatable本身。我过去遇到过问题,但它周围的p:panel。@L-Ray my getter方法不返回更新的列表,我检查了一下,返回了它的大小。另外,如果我再次单击“删除”按钮,则每次会话只能删除一个项目,该按钮不会执行任何操作,即使“确认”对话框也不会显示。我修复了数据表的更新,实际上我是从init方法获取CustomerDataS,这就是为什么除非我再次登录,否则它不会更新。但我仍然有第二个问题,当我删除第一个项目时,一切正常,它被删除,数据表被更新,但是如果我选择另一个项目删除它,确认对话框不会显示,glassfish中也不会显示任何内容log@L-光线当我删除第一个项目时,我需要用F5刷新页面,以便能够删除另一个项目。你知道我为什么或者如何解决这个问题吗??
<p:commandButton id="deleteButton" 
    value="Delete" 
    disabled="#{dataMB.disabled}" icon="ui-icon-trash"
    actionListener="#{dataMB.deleteData}"
    onclick="if (!confirm('really delete?')) { return false;}" />