【问题标题】:Refreshing datatable rows after edits(add,modify,delete...) [duplicate]编辑后刷新数据表行(添加,修改,删除......)[重复]
【发布时间】:2012-09-14 14:41:17
【问题描述】:

可能重复:
How to ajax-update the p:dataTable from inside the p:dataTable itself?

在我的 xhtml 页面中,我有一个包含 Group 类型对象的 dataTable,以及一个用于将新组添加到数据表并最终添加到数据库中的按钮 我正在使用 sessionScoped 托管 Bean,所以我需要在添加新记录后刷新我的数据表行。

为此,我使用了命令按钮组件的更新属性,但数据表没有刷新,代码如下:

  <p:fieldset legend="Groups">  

     <p:commandButton id="newGroup" value=" New  Group" onclick="newGoupDlg.show();" 
      type="button" update="groupsDataTable"/>
                   <br/>

      <p:dataTable id="groupsDataTable" var="group" value="#
         {projectAdminisrationMB.groupsList}" 
                    rowKey="#{group.name}"
                     rowIndexVar="rowIndex"
                      binding="#{table}">  

                      <f:facet name="header">  

                      </f:facet>  

                         <p:column id="column2">
            <f:facet name="header">
            <h:outputText value="Group Name"></h:outputText>
            </f:facet>
         <p:graphicImage value="/images/group/#{group.name}.gif" />  


     <h:commandLink action="#{projectAdminisrationMB.showGroupDetails}" 
         value="#{group.name}">  
 <f:setPropertyActionListener target="#{projectAdminisrationMB.selectedGroup}" 
       value="#{group}" />
 <f:setPropertyActionListener target="#{projectAdminisrationMB.selectedGroupName}" 

    value="#{group.name}" />


     <f:setPropertyActionListener target="#
    {projectAdminisrationMB.selectedGroupDescription}" value="#{group.description}" />
       <f:setPropertyActionListener target="#
     {projectAdminisrationMB.selectedGroup.dbRowIndex}" value="#{table.rowIndex}" />

       </h:commandLink>

    </p:column>
        <p:column id="column3">
    <f:facet name="header">
    <h:outputText id="text3" value=" Group Description "></h:outputText>
     </f:facet>
      <h:outputText value="#{group.description}"></h:outputText>
    </p:column>


               <f:facet name="footer">  

                      </f:facet>  
                 </p:dataTable>  


             <p:dialog header="New Group" widgetVar="newGoupDlg"  width="750" 

       showEffect="explode" hideEffect="explode">  
                        <br/>   <br/>  
                        <h:outputText value=" New Group : " /> 

                        <p:inputText id="newGroupName" value="# 

             {projectAdminisrationMB.newGroup.name}">
                          <f:validator validatorId="requiredValidator"></f:validator>
                        </p:inputText>
                         <br/>   <br/>   
                         <h:outputText value="Group Description :" />  
                            <br/>   <br/>   
                         <p:editor id="newGroupDescription" value="# 


        {projectAdminisrationMB.newGroup.description}" width="600"/> 
                        <br/>   <br/>   

         **<p:commandButton id="ValidateNewGroup"  value="Validate"  
            actionListener="#{projectAdminisrationMB.addNewGroup}" 
            onclick="newGoupDlg.hide()"  update="groupsDataTable" ></p:commandButton>**


                        <p:commandButton id="CancelNewGroup" value=" Cancel " 
              onclick="newGoupDlg.hide()"></p:commandButton>

                    </p:dialog>  

                    <br/>   <br/>   

               </p:fieldset>  

任何想法都会被欣赏

【问题讨论】:

  • 尝试检查萤火虫中的错误。可能的原因是您的dataTable 已前置id。尝试将prependId="false" 设置为您的form 或使用update=":groupsDataTable"update="fooFormId:groupsDataTable"。另外我建议不要在你的按钮中使用onclick,而是使用oncomplete - 有时它会导致问题(但当然这对情况很重要)。
  • 这些组件的封装表格在哪里?您是使用 SessionScoped bean 作为整个页面的支持 bean 还是只是容器来访问数据库?
  • @kolossus sessionScoped bean 用于整个页面

标签: ajax jsf-2 xhtml primefaces


【解决方案1】:

您的问题最常见的原因是没有正确引用数据表的 id。

在浏览器中查看数据表的实际 id 是什么。

当您的数据表位于诸如表单之类的容器中时,容器的 id 会附加到数据表的 id 之前,由 : 分隔(默认情况下)。

所以这个:

<h:form id="form">
    <p:dataTable id="dt" ...
</h:form>

将产生ID为form:dt的数据表

当从另一个容器中引用容器中的元素时,您需要从根开始搜索。这是通过在 id 前面添加 : 来完成的。

例子:

<h:form id="form">
    <p:dataTable id="dt" ...
</h:form>

<h:form id="btnForm">
    <p:commandButton update=":form:dt" ...
</h:form>

你也可以使用绑定:

<h:form binding="#{form}">
    <p:dataTable id="#{dt}" ...
</h:form>

<h:form id="#{btnForm}">
    <p:commandButton update=":#{dt.clientId}" ...
</h:form>

【讨论】:

  • 如果上下文在 JSF2 中找不到指定的客户端 ID,会不会抛出异常?
  • @kolossus:&lt;f:ajax&gt; 会,是的。 &lt;p:xxx&gt; 不会,不会。
  • @BalusC 刚刚检查过,(我相信其他人也这样做)失败了。它编译页面但仍然抛出异常:SEVERE: javax.faces.FacesException: Cannot find component with identifier "pickedGrams" referenced from "j_idt32:grammarMgmtMenu"。 PF 3.4RC1 – kolossus 1 小时前
  • @siebz0r 谢谢,但它不起作用我会在点击添加按钮后调用 findAll 方法
猜你喜欢
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2012-08-03
  • 1970-01-01
  • 2012-01-11
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多